Litebase 1.3 e SuperWaba – Parte 03
Eliminando uma tabela com DROP TABLE
Quando a tabela não é mais necessária ou ela deve ser carregada com novos dados e os antigos devem ser apagados então executamos um DROP TABLE para remover os arquivos.
/**
* Método que exclui a tabela
* @param rg
*/
public void drop(LitebaseConnection conn)
{
//Gerando a instrução SQL
String sql = "DROP TABLE PESSOAS";
conn.executeUpdate(sql);
}
Listagem 7 - Exemplo de DROP TABLE
Estudo de caso
Até o momento apenas apresentei o Litebase, a partir de agora vamos implementar um software real que tenha as seguintes características:
- Lista de Pessoas;
- Permita ao usuário criar um registro na tabela PESSOAS;
- Possibilite selecionar e alterar um registro.
O desenvolvimento d projeto deve começar pela classe responsável pela persistência, crie no pacote samples uma classe chamada Pessoas e a esta codifique segundo a Listagem 8.
//TotalStudio (r)
package samples;
import waba.sys.Settings;
import waba.sys.Vm;
import litebase.LitebaseConnection;
/**
* @author Wellington
*
* @date Sun Mar 16 10:35:20 BRT 2008
*
*/
public class Pessoas {
public static String tableName = "PESSOAS";
public int rowid = 0;
/** Unique identifier */
public String codRg = new String();
/** Information */
public String nome = new String();
/** Comment */
public waba.util.Date datNascimento = new waba.util.Date();
/** Comment */
public waba.sys.Time hourCadastro = new waba.sys.Time();
private LitebaseConnection conn;
/**
* Construtor, utilizo ele para iniciar variáveis
*/
public Pessoas() {
conn = LitebaseConnection.getInstance(Settings.appCreatorId);
}
public static void createTable() {
// Iniciando a conexão
LitebaseConnection conn = LitebaseConnection.getInstance(Settings.appCreatorId);
// Gerando as SQLs
String sql_create = "CREATE TABLE PESSOAS(COD_RG CHAR(20),NOME CHAR(50) NOCASE,DAT_NASCIMENTO DATE,HOUR_CADASTRO DATETIME)";
String sql_key = "ALTER TABLE PESSOAS ADD PRIMARY KEY(COD_RG)";
// Validando se já existe a tabela
if (!conn.exists("PESSOAS")) {
try {
// Se não existe podemos criar
conn.execute(sql_create);
conn.executeUpdate(sql_key);
} catch (Exception ex) {
Vm.debug("Erro: " + ex.getMessage());
}
} else {
Vm.debug("Não foi preciso criar pois a tabela já existe");
}
}
/**
* Método que salva a informação na base de dados
*/
public boolean save() {
try {
String sql = "";
litebase.ResultSet rs = conn.executeQuery("SELECT rowid FROM " + tableName + " WHERE COD_RG='" + this.codRg + "'");
if (rs != null && rs.next()) {
rs.close();
sql = "UPDATE " + tableName + " SET COD_RG='"+ this.codRg + "',NOME='" + this.nome + "',DAT_NASCIMENTO='" + this.datNascimento.toString(waba.sys.Settings.DATE_YMD)+ "',HOUR_CADASTRO='" + formatTimeForLitebase(this.hourCadastro) + "' WHERE COD_RG='" + this.codRg + "'";
} else {
this.hourCadastro = new waba.sys.Time();
sql += "INSERT INTO "+ tableName + " (COD_RG,NOME,DAT_NASCIMENTO,HOUR_CADASTRO) VALUES('" + this.codRg + "','" + this.nome + "','" + this.datNascimento.toString(waba.sys.Settings.DATE_YMD) + "','" + formatTimeForLitebase(this.hourCadastro) + "')";
}
conn.executeUpdate(sql);
return true;
} catch (Exception ex) {
waba.sys.Vm.debug(tableName + ";" + ex.getMessage());
}
return false;
}
/**
* Método que carrega a entdidade dado uma sql
* @param sql Sql a ser utilizada pelo mecanismo de busca
*/
public boolean load(String sql) {
try {
litebase.ResultSet rs = conn.executeQuery(sql);
if (rs != null && rs.next()) {
this.codRg = rs.getString("COD_RG");
this.nome = rs.getString("NOME");
this.datNascimento = rs.getDate("DAT_NASCIMENTO");
this.hourCadastro = rs.getDateTime("HOUR_CADASTRO");
rs.close();
return true;
}
rs.close();
} catch (Exception ex) {
waba.sys.Vm.debug(tableName + ";" + ex.getMessage());
}
return false;
}
/**
* Método que carrega a entdidade dado um número de RG
* @param cod_rg RG que estamos procurando
*/
public boolean loadByRG(String cod_rg) {
String sql = "SELECT ROWID,COD_RG,NOME,DAT_NASCIMENTO,HOUR_CADASTRO FROM " + tableName + " WHERE COD_RG='" + cod_rg + "'";
return load(sql);
}
/**
* Dado um Time este método retorna uma string no formato do Litebase
* @param datetime DataTime a ser formatada
* @return String no formato do Litebase
*/
public String formatTimeForLitebase(waba.sys.Time datetime) {
return datetime.year + "/" + datetime.month + "/" + datetime.day + " " + datetime.hour + ":" + datetime.hour + ":" + datetime.minute;
}
/**
* Exclui o registro corrente
* @return True se for excluido
*/
public boolean delete()
{
String sql = "DELETE FROM PESSOAS WHERE COD_RG='"+ this.codRg +"'";
return (conn.executeUpdate(sql) > 0);
}
/**
* Método que consulta a base de dados
* @param sql SQL utilizada como consulta
* @return Array de duas dimenções, ou nulo se não houver registros
*/
public static String[][] getData(String sql)
{
LitebaseConnection conn = LitebaseConnection.getInstance(Settings.appCreatorId);
litebase.ResultSet rs = conn.executeQuery(sql);
String[][] data = null;
if(rs != null)
{
data = rs.getStrings();
//Nunca esqueça de fechar, se isso não fosse preciso não teria criado
//a variável data, teria retornado direto
rs.close();
}
return data;
}
}
Listagem 8 - Classe Pessoa
Nesta classe não há nada de novo, criamos um método chamado createTable() que valida a existência da classe, este deve ser Static pois não há nenhuma informação relevante nas variáveis não Static que sejam interessantes para este método.
O método formatTimeForLitebase() formata um objeto de waba.sys.Time() para o formato correto do Litebase, futuras implementações do Litebase esta ação não será necessária. Na Listagem 3 este método não foi preciso, pois o PreparedStatement já prepara a SQL com os formatos necessários.
Agora que temos a entidade responsável pela manipulação dos dados vamos desenvolver a classe inicial que é chamada pela máquina virtual. Crie uma classe chamada FrmMain e edite o código da Listagem 9.
package samples;
import waba.fx.Color;
import waba.ui.Calendar;
public class FrmMain extends waba.ui.MainWindow {
public FrmMain() {
//Invoque o método static que cria a tabela se for necessário
Pessoas.createTable();
//Estamos informando a VM que ela deve assumir uma interface
//com estilo VISTA que no meu ponto de vista é o mais bonito
waba.sys.Settings.setUIStyle(waba.sys.Settings.Vista);
//Troque a cor de fundo para branco, por padrão a cor de fundo é azul
this.setBackColor(waba.fx.Color.WHITE);
//A cor padrão do calendário é laranja, estou alterando esta cor para branco
//e os botões um tom de cinza
waba.ui.UIColors.calendarAction = Color.getColor(200, 200, 200);
waba.ui.UIColors.calendarBack = Color.WHITE;
//Nunca acredite que o usuário que vai operar o equipamento é alguem que conheça
//a lingua inglesa
Calendar.todayClearCancel = new String[] { "Hoje", "Limpar", "Cancelar" };
Calendar.weekNames = new String[] { "D", "S", "T", "Q", "Q", "S", "S" };
waba.util.Date.monthNames = new String[] { "", "Janeiro", "Fevereiro","Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro" };
}
public void onStart() {
//O método SWAP carrega um Container
this.swap(new FrmListPessoa());
}
}
Listagem 9 - Código da classe FrmMain
No SuperWaba é comum encontrarmos variáveis Static com valores padrões, no caso do calendário podemos alterar algumas propriedades de forma que o visual fique mais amigável. Esta opção também é válida para a classe Date.
Dicas Rápidas
1 – Nunca carregue objetos de interface no construtor, sempre utilize o onStart() que é chamado pela VM após a execução do construtor;
2 – Use a classe que estende de MainWindow apenas para iniciar as variáveis globais e alterar valores Static, a parte gráfica deve ser trabalhada em Container.