|
September 28, 2016
|

Persistência de dados no TotalCross: SQLite

No nosso último artigo sobre Persistência de dados no TotalCross, vimos como persistir dados simples em um arquivo comum. Neste artigo, explicaremos o uso do SQLite, que é um banco de dados padrão de mercado.

Mas antes de iniciarmos, uma observação sobre o banco de dados criado pela equipe da TotalCross, o Litebase. Quando o Litebase surgiu, em 2003, os bancos de dados para dispositivos móveis eram muito rudimentares, não havia nem o conceito de se usar SQL para manuseá-los. Decidimos então criar nosso próprio banco de dados, que foi evoluindo até ficar avançado o suficiente para ser usado nas aplicações, com um bom desempenho, mesmo em aparelhos limitados. Porém, nos últimos anos, com o surgimento do SQLite, nós decidimos descontinuar o Litebase, pois o SQLite é aperfeiçoado por centenas de empresas em todo o mundo, e possui uma gama de recursos muito superior ao Litebase.

Bem, a maioria dos nossos clientes ainda usa o Litebase, então, durante o desenvolvimento do driver do SQLite para TotalCross, sentimos a necessidade de criar uma classe que pudesse facilitar a migração dos aplicativos do Litebase para o SQLite, surgindo assim, o SQLiteUtil. Diferentemente do Litebase, o SQLite segue a interface padrão de JDBC e, portanto, se você estiver criando uma aplicação e não quiser usar o SQLiteUtil, pode usar apenas o conceito do JDBC para fazer a aplicação.

Abaixo temos um exemplo de código que usa apenas o JDBC:

totalcross.sql.Connection driver = DriverManager.getConnection("jdbc:sqlite:" + Convert.appendPath(Settings.appPath, "person.db"));
totalcross.sql.Statement statement = driver.createStatement();
executeUpdate("drop table if exists person"); // sintaxe própria do SQLite
statement.execute("create table PERSON (NAME CHAR(8))");
statement.executeUpdate("insert into person values ('Fred flintstone');
totalcross.sql.ResultSet rs = statement.executeQuery("select * from person");
while (rs.next())
Vm.debug(rs.getString(1));
rs.close();
statement.close();
driver.close();

Como você pode ver, a única diferença para um aplicativo JDBC normal é o uso do pacote totalcross.sql, que é um porte do JDBC para o TotalCross. Não tente usar o java.sql, pois dará erro quando você for empacotar a aplicação. Note que você pode invocar outros comandos do SQLite usando Statement.execute.

O SQLiteUtil facilita bastante o porte do Litebase para o SQLite, pois possui quase todos os métodos existentes nas classes do Litebase e que não existem no JDBC. Uma das poucas exceções é a classe RowIterator, que não existe no SQLite, nem no JDBC, nem no SQLiteUtil. O jeito, nesse caso, é criar um campo de atributo.

Veremos a seguir alguns exemplos de código que usa o SQLiteUtil juntamente com classes do JDBC.

totalcross.db.sqlite.SQLiteUtil util = new SQLiteUtil(Settings.appPath,"fb.db");
Statement st = util.con().createStatement();
st.execute("create table if not exists users (name varchar, photo blob, active int)");
st.close();

O método con() cria uma conexão para o banco de dados, se ela já não tiver sido criada. Existem outros métodos no SQLiteUtil, como tableExists, isNotEmpty, getColCount, executeQuery + close(ResultSet), getStrings1, getStrings, getString, getInt, getShort, getRowCount, fixQuote, shrinkDB, listAllTables, existsIndex, dentre outros.

Uma coisa muito importante é sempre fechar o ResultSet quando terminar de usá-lo, resguardando, inclusive, contra disparos de exceções, pois caso contrário o SQLite poderá disparar exceções informando que a tabela está travada (table is locked). Uma forma de fazer é dessa forma:

ResultSet rs = null;
try
{
rs = util.con().executeQuery(....);
...
}
finally
{
if (rs != null) try {rs.close();} catch (Throwable t) {}
}

Com isso, demostramos como é fácil trabalhar com banco de dados em SQLite no TotalCross.

Comments

More articles

Afinal, é possível criar app sem saber programação?

November 16, 2018

Como transformar um website em aplicativo?

November 14, 2018

Aplicativos: O que conhecer antes de criar um

November 13, 2018

É possível instalar aplicativos Android no Windows?

November 9, 2018