Feita a introdução básica sobre como o android manipula e gerencia bancos de dados, podemos avançar para um tópico, digamos, um pouco mais avançado e que tornará nossas iterações com os bancos de dados em Android muito mais fáceis.
ORMLite, ou Object Relational Mapping Lite, é um framework que (como descrito em seu próprio website – http://ormlite.com/): “ (…) provê algumas funcionalidades simples e leves para persistência de objetos java em bancos de dados SQL, evitando a complexidade e sobrecarga de pacotes ORM padrão.”
A utilização do ORMLite em projetos android é bem simples, basta que sejam baixados os jar’s:
do próprio site do projeto e adicionados como dependência no seu projeto Android.
Feito isto, podemos começar a implementar nosso projeto tirando proveito das funcionalidades providas pelo framework. Neste post eu realizarei algumas alterações nas classes apresentadas nos posts anteriores (Databases em Android – Parte 1 e Databases em Android – Parte 2) para a utilização do framework, demonstrando como fica mais simples nossa iteração com o SQLite utilizando esta ferramenta.
Primeiro, alteraremos nossa entidade, anotando-a com os devidos parâmetros, para que o framework possa realizar as tarefas necessárias para criação e manutenção da base de dados:
[cc lang=”java” width=”100%”]
@DatabaseTable(tableName = “usuario”)
public class Usuario {
@DatabaseField(columnName = “id”, id = true, generatedId = true)
private int id;
@DatabaseField(columnName = “login”, canBeNull = false)
private String login;
@DatabaseField(columnName = “nome”, canBeNull = false)
private String nome;
@DatabaseField(columnName = “idade”, dataType = DataType.INTEGER, canBeNull = false)
private int idade;
/**
* getters e setters
*/
}
[/cc]
Nossa classe UsuarioHelper, agora deve extender OrmLiteSqliteOpenHelper, como segue:
[cc lang=”java” width=”100%”]
public class UsuarioHelper extends OrmLiteSqliteOpenHelper {
/** The Constant DATABASE_NAME. */
private static final String DATABASE_NAME = “AndroidORM.db”;
/** The Constant DATABASE_VERSION. */
private static final int DATABASE_VERSION = 1;
/** The usuario dao. */
private Dao usuarioDAO = null;
public UsuarioHelper (final Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(final SQLiteDatabase database, fina ConnectionSource connectionSource) {
try {
TableUtils.createTable(connectionSource, Usuario.class);
} catch(SQLException e) {
Log.e(UsuarioHelper.class.getName(), “Não foi possível criar a base de dados”, e);
throw new RuntimeException(e);
} catch (java.sql.SQLException e) {
e.printStackTrace();
}
}
@Override
public void onUpgrade( final SQLiteDatabase database, final ConnectionSource connectionSource, final int oldVersion,
final int newVersion) {
try {
TableUtils.dropTable(connectionSource, Usuario.class, true);
onCreate(database, connectionSource);
} catch(java.sql.SQLException e) {
Log.e(UsuarioHelper.class.getName(), “Não foi possível dropar o banco”, e);
throw new RuntimeException(e);
}
}
public DaogetUsuarioDAO() {
if (this.usuarioDAO == null) {
try {
usuarioDAO = getDao(Usuario.class);
} catch (java.sql.SQLException e) {
e.printStackTrace();
}
}
return usuarioDAO;
}
@Override
public void close() {
super.close();
usuarioDAO = null;
}
}
[/cc]
Como pode-se notar, agora a database e suas tabelas são criadas e atualizadas utilizando os métodos TableUtils.createTable e TableUtils.dropTable do framework. Para estes métodos, basta que sejam fornecidos a entidade, a conexão com o banco e no caso de dropTable, um parâmetro que indica se os erros devem ser ignorados ou não.
Outro destaque nesta classe, é que agora nosso DAO é fornecido pelo framework, através do método getDao. Este DAO possui diversos métodos para o gerenciamento de dados no SQLite, alguns deles serão comentados em posts futuros, tais como o queryBuilder(), que fornece facilidades parecidas com as do Criteria do hibernate. Permitindo que queries complexas sejam feitas sem a necessidade de utilização de codificação SQL.
Obs.: note que o DAO é ‘zerado’ quando a nossa classe é encerrada, no método close(). Isso é importante para que seu código fique coerente e não fiquem conexões abertas sem uso.
Este foi o segundo post sobre Databases no Android, espero que tenham gostado. Quaisquer dúvidas, sugestões e/ou reclamações, comentem!
_________________________________________
Lucas Oliveira – Analista Programador na redspark.
Bacharel em Sistemas de Informação pela Universidade de São Paulo.
@OliveiraLima_
Olá,
Estive acompanhado as tuas postagens sobre o OrmLite.
Tenho um problema em meu projeto:
preciso buscar várias imagens do banco de dados e exibir em um grid para que o
usuario possa escolher uma e adicinar a um cadastro.
A solução:
Estou utilizando uma lista com paginação e preciso buscar um lista limitada de 21 imagens por vez
O problema:
Tentei usar no QueryBuilder o método offset() e limit()
Mas somente o limit funciona, pois quando os dados chegam,
eles vem de 0 ao limit, como se o limit nao estivesse sendo aplicado.
Já utilizou algo semelhante? O que acha que estou fazendo de errado?
Desde já agradeço se puder ajudar
Att
*como se o offset nao estivesse sendo aplicado.
Olá! Comecei a usar o ORMLite a pouco tempo e agora estou com um problema, ele não está fazendo a rotina onUpgrade() quando incremento o valor do DATABASE_VERSION. E está me dando a mensagem “O arquivo JAR do Java ormlite-core-android-4.48.jar não pôde ser iniciado”. Você conhece alguma solução?
Obrigado!