Mobile

Databases em Android (ORMLite) – 3

 Android: ORMLite

 

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:

  • ormlite-android-<versão>.jar, e
  • ormlite-core-<versão>.jar;

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_

 

3 Comments

  • Fabio Dresch disse:

    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

  • Fabio Dresch disse:

    *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!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Compartilhe isso: