domingo, 28 de outubro de 2012

Realidade Aumentada com Android e VUFORIA SDK














Vuforia SDK, guarde esse nome !
Há algum tempo estava pesquisando sobre SDKs de realidade aumentada e resolvi testar essa ferramenta fantástica de desenvolvimento.
Nesse tutorial vou ensinar como baixar todos os recursos necessários e preparar todo o ambiente para o desenvolvimento com esse SDK.
Vamos compilar o projeto desse aplicativo... http://www.youtube.com/watch?v=42MvJ1QgPz8 (ImageTargets).
Ele funciona de uma forma muito interessante.
Na programação dele existe código nativo(ndk), que faz reconhecimento de imagens e projeta no espaço reconhecido um modelo 3D e toda a movimentação da câmera física interfere na câmera do modelo 3D.
Assistam o vídeo... com certeza vai ser mais fácil de entender. :)
Vai encarar essa? Então aí vamos...

Passo 1. Baixando as ferramentas

1. Além do Android SDK, precisaremos do Android NDK que você pode encontrar no seguinte link http://developer.android.com/tools/sdk/ndk/index.html
Após baixá-lo descompacte em um local de sua preferência.

2. Entre no site da Qualcomm (quem desenvolveu o SDK) e crie uma conta. https://developer.qualcomm.com/user/register

3. Após criar a conta, baixe o SDK nessa URL https://ar.qualcomm.at/qdevnet/sdk/android (no meu caso baixei a versão para Windows) e faça a instalação a padrão.

4. Precisaremos do cygwin para compilar o projeto NDK. Faça o download nessa URL http://cygwin.com/install.html.
Durante a instalação, ao exibir os pacotes, selecione o pacote que fica em All -> Devel -> "make: The GNU version of the 'make' utility" clique em "SKIP" para tirar essa opção e a ferramenta ser instalada e siga a instalação.

Passo 2. Importando o projeto no eclipse

- Abra o eclipse e crie um projeto a partir de um código fonte existente. (File > New > Other > Android > Android Project from Existing Code)

- Em Root Directory aponte para o projeto ImageTargets que está dentro do diretório de instalação na pasta samples e clique em Finish. (no meu caso... \development\Android\vuforia-sdk-android-1-5-9\samples\ImageTargets)

- Você perceberá que o projeto contém um erro, para arrumá-lo clique com o botão direito no projeto e vá em Properties > Java Build Path > Libraries e remova a referência de QCAR.jar e depois clique em Add External Jars.
Esse arquivo poderá ser localizado na pasta de instalação em build > java > QCAR (no meu caso... \development\Android\vuforia-sdk-android-1-5-9\build\java\QCAR\QCAR.jar) e clique em OK.

- Abra a pasta que contém esse arquivo e copie para a pasta libs do seu projeto. (Ctrl+C e Ctrl+V)
Crie essa pasta caso não exista (botão direito no seu projeto > New > Folder) e então copie o arquivo.

Passo 3. Compilando o código NDK

Para compilar o código NDK criaremos um arquivo de lotes.
Crie um arquivo chamado build-project.bat e coloque o conteúdo demonstrado.


@echo on

@set BASHPATH="C:\cygwin\bin\bash"
@set PROJECTDIR="/cygdrive/c/Development/Android/vuforia-sdk-android-1-5-9/samples/ImageTargets"
@set NDKDIR="/cygdrive/c/Development/android-ndk-r8b/ndk-build"

%BASHPATH% --login -c "cd %PROJECTDIR% && %NDKDIR%

@pause:


Faça as seguintes alterações:
- Mude o valor de BASHPATH de acordo com o diretório que você fez a instalação do cygwin.
- Mude PROJECTDIR para o diretório do projeto ImageTargets
- Mude NKDIR para o diretório onde descompactou o NDK.

Salve o arquivo e dê dois cliques para abrir.
Caso ocorra algum erro, verifique se seguiu corretamente todos os passos descritos acima.


Passo 4. Limpando e rodando o projeto

Volte para o eclipse, clique no projeto ImageTargets e vá em Project > Clean e depois clique em Ok.
Abra a pasta chamada "media" do projeto e imprima o conteúdo do arquivo target_stones_A4.pdf.
Se você seguiu corretamente todos os passos, clique em Run e a aplicação será inicializada.
Aponte sua câmera para impressão e veja o que acontece.
Quer ver algo interessante? Mantenha seu aparelho parado e mova a folha.

É claro que desenvolver com essa ferramenta não é algo trivial como talvez já tenham notado, mas no site da Qualcomm é possível localizar muito material a respeito do desenvolvimento com o VUFORIA SDK.
Além disso é possível encontrar alguns projetos no Google Play que usa essa tecnologia.
Vejam o resultado de uma customização nesse sample. :)





Bom.. por hoje é só pessoal, espero que tenham gostado. :)
Qualquer problema ou dificuldade, entrem em contato através do email strangerdroid@gmail.com

Nos vemos na próxima.

StrangerDroid


quinta-feira, 25 de outubro de 2012

Android: Acessando banco de dados fácil e rápido com ORM ! (Avançado)

















Olá amigos, vamos a mais um artigo sobre como trabalhar com Android e banco de dados.
Caso você não tenha lido a primeira parte, sobre como criar a camada de acesso a dados, aí vai o link http://strangerdroid.blogspot.com.br/2012/10/android-acessando-banco-de-dados-facil.html.
Nessa segunda postagem, vamos falar sobre conceitos mais avançados a respeito da ferramenta ORMLite.
Se você fez o exemplo do primeiro artigo, imagino que você tenha se perguntado: "OK, mas como uso uma clausula 'where', 'order' ou 'join'?".
Sem dúvida, essa é uma pergunta muito pertinente !
Na maioria das ferramentas ORM é possível executar todos esses comandos sem escrever nenhuma linha de código sql, no ORMLite não é diferente.
Para exemplificar, usaremos o projeto do artigo anterior, ok?
Vamos fazer mais exemplos?

Passo 1. Usando WHERE para filtrar suas consultas

Abra o arquivo ClientesDAO no package dao. (no meu caso está no package br.com.exemplo.db.dao)
Vamos escrever um método que filtre os resultados apenas dos clientes com sobrenome iguais a "Silva".
Faça a implementação como no exemplo.



public List<Clientes> getBySobreNomeSilva() {
List<Clientes> clientes = new ArrayList<Clientes>();

try{
QueryBuilder<Clientes, Integer> queryBuilder = dao.queryBuilder();
queryBuilder.where().eq("sobrenome", "Silva");
clientes = dao.query(queryBuilder.prepare());
}catch(Exception e){
e.printStackTrace();
}

return clientes;
}

Nesse método retornamos uma lista de Clientes.
Criamos um objeto do tipo QueryBuilder onde trabalharemos com o tipo Clientes e a PK dele é do tipo integer.
Este objeto é responsável pela clausula 'where sobrenome seja igual (eq) "Silva"'.
O último passo é enviar essas informações para a classe dao do ORMLite processar a query.
Simples, não é? Nenhuma linha SQL. :) Próximoooooo.....


Passo 2. Ordenando a sua consulta

No próximo exemplo vamos ordenar o resultado da nossa consulta trazendo todos os registros de clientes ordenando pelo primeiro nome.


public List<Clientes> getByNome() {
List<Clientes> clientes = new ArrayList<Clientes>();

try{
QueryBuilder<Clientes, Integer> queryBuilder = dao.queryBuilder();
queryBuilder.orderBy("nome", false);
clientes = dao.query(queryBuilder.prepare());
}catch(Exception e){
e.printStackTrace();
}

return clientes;
}




A única coisa que muda nesse caso é que chamamos o método "orderBy" que recebe os parâmetros do campo que será ordenado e se ele será "asc" ou "desc". (crescente ou decrescente).


Passo 3. Misturando as coisas

Digamos agora que eu quero o último registro da tabela clientes, como faço?
Notem a facilidade.


public Clientes getLast() {
Clientes cliente = new Clientes();

try{
QueryBuilder<Clientes, Integer> queryBuilder = dao.queryBuilder();
queryBuilder.orderBy("id", true);
cliente = dao.queryForFirst(queryBuilder.prepare());
}catch(Exception e){
e.printStackTrace();
}

return cliente;
}


Fazemos uma query que ordena pelo campo id de forma invertida(trazendo o último até o primeiro) e por fim pegamos o primeiro registro disponível que seria o último inserido.
Pouco código e tudo o que precisamos na mão.


Passo 4. Criando a classe para fazer o join

Vamos supôr que nosso cliente tenha vários endereços que estão armazenados em outra tabela.
Crie no seu package entities a classe Enderecos. (no meu caso, br.com.exemplo.db.entities)


@Entity(name="enderecos")
public class Enderecos {

@Id @GeneratedValue
private int id;

@Column(name="endereco", nullable=false)
private String endereco;

@Column(name="cep", nullable=false)
private String cep;

@DatabaseField(foreign=true)
private Clientes clientes;

public Enderecos() {

}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getCep() {
return cep;
}

public void setCep(String cep) {
this.cep = cep;
}

public Clientes getClientes() {
return clientes;
}

public void setClientes(Clientes clientes) {
this.clientes = clientes;
}

public String getEndereco() {
return endereco;
}

public void setEndereco(String endereco) {
this.endereco = endereco;
}

}


Notem que temos um campo diferente dessa vez !
O campo DataBaseField indica uma FK para a tabela Clientes.
Atenção, a notação DataBaseField é do componente ORMLite e não da JPA.
Se você me perguntar o por que, tenho uma boa resposta.
Nem todas as notações JPA estão disponíveis na ferramenta ORMLite.  =(


Passo 5. Inserindo a tabela na criação da database

Abra o arquivo DataBaseHelper no package connection. (no meu caso br.com.exemplo.db.connection).
Iremos acrescentar a tabela Enderecos como mostrado abaixo.


public class DataBaseHelper<E> extends OrmLiteSqliteOpenHelper {

public DataBaseHelper(Context context) {
super(context, "sistema.db", null, 1);
}

@Override
public void onCreate(SQLiteDatabase db, ConnectionSource src) {
try{
TableUtils.createTable(src, Clientes.class);
TableUtils.createTable(src, Enderecos.class);
}catch(Exception e){
e.printStackTrace();
}
}

@Override
public void onUpgrade(SQLiteDatabase db, ConnectionSource src, int oldVersion, int newVersion) {
try{
TableUtils.dropTable(src, Clientes.class, true);
TableUtils.dropTable(src, Enderecos.class, true);
onCreate(db, src);
}catch(Exception e){
e.printStackTrace();
}
}

@Override
public void close() {
super.close();
}

}


Inserimos uma linha para Create e outra para Upgrade. Nenhum segredo. :)



Passo 6. Criando um DAO para Enderecos

Crie uma classe chamada EnderecosDAO no seu package dao (no meu caso, br.com.exemplo.db.dao)
Faça a implementação como exemplificado.


public class EnderecosDAO extends GenericDao<Enderecos> {

public EnderecosDAO(Context context) {
super(context, Enderecos.class);
}

}



Segue o mesmo modelo de implementação que fizemos no artigo anterior.



Passo 7. Inserindo a referência em Clientes

Precisamos agora inserir a referência no objeto Clientes, ou seja, quando carregarmos um cliente, automaticamente ele deverá carregar uma lista de enderecos. (join)
Abra o arquivo Clientes na pasta entities (no meu caso, br.com.exemplo.db.entities) e faça a modificação conforme demonstrado.


@Entity(name="clientes")
public class Clientes {

    @Id @GeneratedValue
private int id;

    @Column(name="nome", nullable=false)
private String nome;

    @Column(name="sobrenome", nullable=false)
private String sobrenome;

    @Column(name="email", nullable=false)
private String email;
    
    @ForeignCollectionField(eager=false)
    private Collection<Enderecos> enderecos;

public Clientes() {

}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getNome() {
return nome;
}

public void setNome(String nome) {
this.nome = nome;
}

public String getSobrenome() {
return sobrenome;
}

public void setSobrenome(String sobrenome) {
this.sobrenome = sobrenome;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public Collection<Enderecos> getEnderecos() {
return enderecos;
}

public void setEnderecos(Collection<Enderecos> enderecos) {
this.enderecos = enderecos;
}
}


A notação ForeignCollectionField (também da ORMLite e não JPA) faz todo o trabalho.
Ela indica que uma coleção de Enderecos será carregado de forma síncrona(eager=false) toda vez que o objeto Clientes for carregado.


Passo 8. Testando tudo



Antes de testar esse exemplo, remova completamente o aplicativo usado no artigo anterior, ok?
Abra a sua Activity e crie um método como o demonstrado.


    private void testarDB() {
    ClientesDAO daoCli = new ClientesDAO(getApplicationContext());
    Clientes cliente = new Clientes();
    cliente.setNome("StrangerDroid");
    cliente.setSobrenome("Blog");
    cliente.setEmail("strangerdroid@gmail.com");
   
    daoCli.insert(cliente);
    cliente = daoCli.getById(1);
   
    EnderecosDAO daoEnd = new EnderecosDAO(getApplicationContext());
    Enderecos endereco1 = new Enderecos();
    endereco1.setEndereco("Rua da casa");
    endereco1.setCep("234324");
    endereco1.setClientes(cliente);
   
    Enderecos endereco2 = new Enderecos();
    endereco2.setEndereco("Rua da outra casa");
    endereco2.setCep("454545");
    endereco2.setClientes(cliente);
   
    daoEnd.insert(endereco1);
    daoEnd.insert(endereco2);
   
    Clientes clientes = daoCli.getLast();
   
    if (clientes.getEnderecos() != null) {
    Toast.makeText(getApplicationContext(), Integer.toString(clientes.getEnderecos().size()), Toast.LENGTH_LONG).show();
    }


Esse método é responsável por:
- Inserir um cliente chamado "StrangerDroid"
- Inserir dois endereços para esse cliente
- Carregar novamente esse cliente.

E por último ele exibe o número de endereços do usuário.
Se tudo correu bem, ele deve exibir o numero 2 ! :) (dois endereços para o cliente "StrangerDroid")
Quando carregamos o cliente, ele trouxe os endereços. (join)
Talvez você esteja se perguntando: "Legal, mas como uso uma Collection?".
Muito simples, List<Enderecos> enderecos = new ArrayList<SuaCollection>() ; e seja feliz. rs

Aos que tiverem dúvidas, entrem em contato no endereço strangerdroid@gmail.com
Um abraço a todos e nos vemos na próxima.

StrangerDroid




terça-feira, 23 de outubro de 2012

Android e JSON simples e descomplicado

















O formato JSON além de ser o mais leve para o intercâmbio de dados computacionais, também é suportado pelas bibliotecas nativas do Android.
Para aplicativos que fazem troca de dados online, com certeza esse é o formato mais indicado, pois sua aplicação irá transferir apenas os dados realmente necessários com uma quantidade muito pequena de bytes.
Caso você não conheça o formato JSON, aí vai uma boa referência... http://www.w3schools.com/json/default.asp.
Desenvolvedores que conhecem a linguagem XML sentirão muita facilidade em entender.
Mas vamos fazer um exemplo ?

Passo 1. O conteúdo JSON

{
"employees": [
{ "firstName":"John" , "lastName":"Doe", age:20 }, 
{ "firstName":"Anna" , "lastName":"Smith", age: 30 }, 
{ "firstName":"Peter" , "lastName":"Jones", age: 40 }
]
}


Note que na estrutura temos:
- Um array com o nome employees.
- Uma lista de três objetos.
- Propriedades de cada objeto.


Passo 2. Escrevendo uma classe employee

Crie uma classe no seu projeto com o nome Employee e faça a implementação demonstrada.


public class Employee {

private String firstName;
private String lastName;
private int age;

public Employee() {

}

public String getFirstName() {
return firstName;
}

public Employee setFirstName(String firstName) {
this.firstName = firstName;
return this;
}

public String getLastName() {
return lastName;
}

public Employee setLastName(String lastName) {
this.lastName = lastName;
return this;
}

public int getAge() {
return age;
}

public Employee setAge(int age) {
this.age = age;
return this;
}

}

Usamos na implementação dessa classe o padrão Fluent Interface.
Caso não conheça, aí vai uma referência... http://en.wikipedia.org/wiki/Fluent_interface.


Passo 3. Embarcando o conteúdo

Vá no seu projeto em: res/values e abra o arquivo strings.xml.
Abra mais uma tag string (com o nome "employeesjson") e coloque o conteúdo do passo 1 como exemplificado abaixo.


<string name="employeesjson">{
"employees": [
{ "firstName":"John" , "lastName":"Doe", age:20 }, 
{ "firstName":"Anna" , "lastName":"Smith", age: 30 }, 
{ "firstName":"Peter" , "lastName":"Jones", age: 40 }
]
}</string>



Passo 4. Escrevendo uma função que leia o JSON

Na sua Activity faça a implementação da função demonstrada.


private List<Employee> getEmployees() {
    List<Employee> employees = new ArrayList<Employee>();
   
    try{
    String conteudo = getString(R.string.employeesjson);
    JSONArray arrayOfEmployees = new JSONObject(conteudo).getJSONArray("employees");
   
    for (int i=0; i<arrayOfEmployees.length(); i++) {
    JSONObject employeeObject = arrayOfEmployees.getJSONObject(i);
    employees.add(new Employee().setAge(employeeObject.getInt("age"))                                             .setFirstName(employeeObject.getString("firstName"))                     .setLastName(employeeObject.getString("lastName")));
    }
    }catch(Exception e){
    e.printStackTrace();
    }
   
    return employees;
    }


Nessa função retornamos uma lista de employees.
Carregamos o conteúdo do strings.xml através do comando getString e parseamos com o objeto JSONArray para percorrer todos os itens, lendo seus parâmetros e adicionando na lista.
Esse método faz o mapeamento de todo o conteúdo JSON e o transforma em objetos.
Mais uma dica simples e descomplicada de ser feita. :)
Caso tenha dúvidas, entre em contato conosco através do email strangerdroid@gmail.com
Nos vemos na próxima.

StrangerDroid


segunda-feira, 22 de outubro de 2012

Android: Acessando banco de dados fácil e rápido com ORM !


Ainda me lembro quando comecei a desenvolver Android e me deparei com documentações informando como acessar um banco de dados. (SQLite)
A primeira impressão foi: "Uau, parece ser bem simples".
E foi ! O único problema é que toda a camada de acesso a dados fica na responsabilidade do desenvolvedor e com isso muito código precisaria ser escrito para ter uma camada de dados consistente e de fácil entendimento e manutenção.
Por conta desse tipo de situação resolvi pesquisar há algum tempo, alguma ferramenta que desse ao desenvolvedor a facilidade de programar usando ORM.... ferramentas como o Linq da linguagem C#, Hibernate (e suas muitas variações).
No fim das contas acabei encontrando uma ferramenta muito boa, com portabilidade para Android e que simplifica toda a escrita da camada de dados de um projeto.
A ferramenta que encontrei se chama ORMLite. http://ormlite.com/
Ela funciona de forma muito simples ! Em resumo são esses os passos:
1. Você cria o seu DataBaseHelper (classe responsável para criar o banco de dados, informando o nome da database, as tabelas e ações de upgrade do banco de dados).
2. Você cria suas classes (que serão as tabelas) usando anotações da própria ferramenta ou a parte mais legal da ferramenta... ELA ACEITA JPA ! (caso não saiba o que é jpa aí vai uma boa referência... http://imasters.com.br/artigo/21505/java/utilizando-hibernate-jpa-no-desenvolvimento-em-java--mysql)
3. Você cria suas classes Dao e passa a fazer todo o CRUD em poucas linhas.
E pronto é só usar ! rs

Mas bom... não vamos ficar só nisso, vamos fazer um exemplo !

Passo 1. Baixando as ferramentas

Faça o download dos arquivos ormlite-android-4.41.jar e ormlite-core-4.41.jar no site
http://ormlite.com/releases/  (se houver alguma versão mais recente não tem problemas)

Faça o download do arquivo hibernate-jpa-2.0-api-1.0.1.Final.jar que você encontra
no pacotes de instalação do hibernate para java.http://www.hibernate.org/downloads (também não tem problemas se você pegar uma versão mais nova)

Passo 2. Reconhecendo no projeto

Copie esses arquivos para a pasta libs do seu projeto e faça a referência a elas clicando com o botão  direito no seu projeto e logo após Properties.
Clique no item Java Build Path e depois clique em Libraries.
Clique no botão Add JARs...
Abra a pasta libs do seu projeto e selecione os arquivos.

Passo 3. Escrevendo as entidades

Crie um package no seu projeto para criar as entidades que serão as tabelas da database. (coloque o nome que preferir. No meu caso ficou assim: br.com.exemplo.db.entities)
Crie uma classe chamada Clientes como a descrita abaixo:

@Entity(name="clientes")
public class Clientes {
 @Id @GeneratedValue
private int id;
 @Column(name="nome", nullable=false)
private String nome;
 @Column(name="sobrenome", nullable=false)
private String sobrenome;
 @Column(name="email", nullable=false)
private String email;
public Clientes() {
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getNome() {
return nome;
}

public void setNome(String nome) {
this.nome = nome;
}

public String getSobrenome() {
return sobrenome;
}

public void setSobrenome(String sobrenome) {
this.sobrenome = sobrenome;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}
}

Note a simplicidade na implementação da classe. Usamos:
- Entity para definir a classe como tabela.
- Id e GeneratedValue para criar a PK e dizer que ela é auto-incremento.
- Column e Nullable para dizer que se trata de uma coluna que não pode ser nula.

Simples não?

Passo 4. Escrevendo a classe helper

Crie um package para armazenar a classe responsável por criar o banco de dados. (no meu caso ficou assim... br.com.exemplo.db.connection)
Crie uma classe com o nome DataBaseHelper e faça a implementação como o exemplo.

public class DataBaseHelper<E> extends OrmLiteSqliteOpenHelper {
public DataBaseHelper(Context context) {
super(context, "sistema.db", null, 1);
}

@Override
public void onCreate(SQLiteDatabase db, ConnectionSource src) {
try{
TableUtils.createTable(src, Clientes.class);
}catch(Exception e){
e.printStackTrace();
}
}

@Override
public void onUpgrade(SQLiteDatabase db, ConnectionSource src, int oldVersion, int newVersion) {
try{
TableUtils.dropTable(src, Clientes.class, true);
onCreate(db, src);
}catch(Exception e){
e.printStackTrace();
}
}
@Override
public void close() {
super.close();
}
}


Note que criamos a classe herdando de OrmLiteSqliteOpenHelper e criamos o banco de dados("sistema.db") com a tabela Clientes. 


Passo 5. Escrevendo a classe dao

Crie um package para armazenar suas classes dao. (no meu caso ficou assim... br.com.exemplo.db.dao)
Crie uma classe chamada GenericDao que será nossa classe base e faça a implementação demonstrada.

public abstract class GenericDao<E> extends DataBaseHelper<E> {

protected Dao<E, Integer> dao;
private Class<E> type;
public GenericDao(Context context, Class<E> type) {
super(context);
this.type = type;
setDao();
}
protected void setDao() {
try{
dao = DaoManager.createDao(getConnectionSource(), type);
}catch(Exception e){
e.printStackTrace();
}
}

public List<E> getAll() {
try{
List<E> result = dao.queryForAll();
return result;
}catch(Exception e){
e.printStackTrace();
return null;
}
}

public E getById(int id) {
try{
E obj = dao.queryForId(id);
return obj;
}catch(Exception e){
e.printStackTrace();
return null;
}
}

public void insert(E obj) {
try{
dao.create(obj);
}catch(Exception e){
e.printStackTrace();
}
}

public void delete(E obj) {
try{
dao.delete(obj);
}catch(Exception e){
e.printStackTrace();
}
}

public void update(E obj) {
try{
dao.update(obj); 
}catch(Exception e){
e.printStackTrace();
}
}
}

Note que essa classe já deixa pronta todos os métodos básicos para acesso ao banco de dados. (só precisamos escrever uma vez)
Agora vamos implementar a nossa classe dao.
Crie uma classe chamada ClientesDAO e faça a implementação como demonstrado.

public class ClientesDAO extends GenericDao<Clientes> {

public ClientesDAO(Context context) {
super(context, Clientes.class);
}
}


Note a quantidade pequena de linhas que precisamos para escrever a classe dao de clientes.

Passo 6. Inserindo um cliente

Coloque um botão no seu projeto e faça a implementação demonstrada no evento de clique.

     ClientesDAO dao = new ClientesDAO(getApplicationContext());
    Clientes cliente = new Clientes();
    cliente.setEmail("strangerdroid@gmail.com");
    cliente.setNome("Stranger");
    cliente.setSobrenome("Droid");
    dao.insert(cliente);


Ao fazer isso o banco de dados é criado na pasta "databases", as tabelas são criadas e você acabou de inserir um registro.
Se você pedir o comando "dao.getAll()" ele retornará uma List<Clientes>. :)
Fora isso, agora você tem métodos para fazer delete, update, select todos prontos.

Espero que esse artigo possa ajudá-lo a iniciar o desenvolvimento com a ferramenta OrmLite.
Além do que demonstramos podemos fazer diversas outras coisas sem escrever nem uma linha sequer de código sql.
Aos que tiverem problemas me enviem emails no strangerdroid@gmail.com que terei prazer em ajudá-lo.
Até a próxima. :)

StrangerDroid