Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Descomplicando ORM no Android com ORMAN

Descomplicando ORM no Android com ORMAN

Slides da minha apresentação no Devfest São Paulo.

Ubiratan Soares

November 30, 2012
Tweet

More Decks by Ubiratan Soares

Other Decks in Programming

Transcript

  1. • Algumas aplicações Android precisam de DB local • Front-end

    com SQLite na API do Android via classes SQLiteOpenHelper e SQLiteDatabase • Até usável para poucas tabelas... • Entendiante para modelos de dados um pouco maiores... • Não queremos escrever mais SQL, usar Cursor, etc, etc... MOTIVAÇÃO
  2. • Qual o custo de setup e integração no projeto?

    • Quais os tipos de relacionamentos suportados? • Oferece suporte à transações? • Oferece suporte à lazy loading? • Oferece Query Builder? E otimização sobre consultas? • Oferece API assíncrona? • Código SQL gerado é robusto? • Oferece suporte à migração? SOLUÇÕES DE ORM
  3. • Muitas soluções no mundo open-source • Poucas com robustez

    e maturidade realmente aceitável... OPÇÕES DE ORM Framework Abordagem Acesso Tamanho Maturidade ORMLite JPA DAO / Entity 280 Kb 2+ anos greenDAO Code- generation DAO / Entity 70 Kb 2+ anos ORMAN JPA Entity 170 Kb 3+ anos AndrORM Custom - 54 Kb 1+ ano
  4. • A maioria das boas soluções não atende todos os

    nossos sonhos ! • A imensa maioria dos projetos menos conhecidos não atende quase nenhum desses pontos ! • A escolha depende da necessidade do projeto ! ALGUMAS RESPOSTAS
  5. • API ORM minimalista para MySQL e SQLite • Port

    para Android • Projeto maduro • Ótima documentação ORMAN https://github.com/ahmetalpbalkan/orman/
  6. • Setup extremamente simples no projeto • Abordagem tipo Entity

    • Suporte a todos os tipos de relacionamento • Oferece Query builder • Código SQL gerado é robusto • SQL 1999 Compliant PONTOS POSITIVOS
  7. • Não oferece suporte à transações • Sem suporte à

    lazy loading • Não oferece API assíncrona • Não oferece suporte à migração LIMITAÇÕES
  8. DECLARANDO UMA ENTITY @Entity(table = "constructions") public class Construction extends

    Model<Construction> { @PrimaryKey(autoIncrement = true) public int id; public String name; public Client client; public Local local; public Date deadline; public boolean done; public String picturePath; @OneToMany(toType = Journal.class, onField = "construction") public EntityList<Construction, Journal> journals = new EntityList<Construction, Journal> (Construction.class, Journal.class, this); }
  9. USANDO UMA ENTITY Construction itaquerao = new Construction( ); itaquerao.insert(

    ); itaquerao.doCoracao = true; itaquerao.update( ); ... arenaSegundona.owner.seriaA = false; arenaSegundona.delete( );
  10. • Entitys não conseguem implementar Parcelable • Podem ser serializadas

    ao custo de uma coluna adicional no DB (serialVersionUid) ... • Solução alternativa : caching ! (até desejável) OBSERVAÇÕES
  11. EXECUTANDO CONSULTAS public Construction fetchByID(int constructionID) { if (mCache ==

    null) { getCache(constructionID); } return mCache; } private void getCache(int constructionID) { if (constructionID > 0) { Query query = ModelQuery.select() .from(Construction.class) .where(C.eq(COLUMN_ID, constructionID)) .getQuery(); mCache = Construction.fetchSingle(query, Construction.class); } }
  12. EXECUTANDO CONSULTAS public List<Construction> fetchByClient() { Query query = ModelQuery.select()

    .from(Construction.class) .orderBy(CLIENT_SORTING) .getQuery(); return Construction.fetchQuery(query, Construction.class); } public List<Construction> fetchSortedByName(boolean status) { Query query = ModelQuery.select() .from(Construction.class) .where(C.eq(COLUMN_STATUS,status)) .orderBy(NAME_SORTING).getQuery(); return Construction.fetchQuery(query, Construction.class); }
  13. • Query pode ser construído a partir de uma String

    SQL • Entity possui outros métodos para fetching - fetchAll - fetchQuery - fetchSingle - fetchSingleValue • Entity possui método execute(query) MAIS SOBRE CONSULTAS
  14. • Projetos que necessitem de rápida curva de assimilação da

    solução ORM • DB com tabelas pequenas que precisem de suporte à relacionamentos, mesmo que várias! • Aplicações que possam viver bem sem suporte à transações • Aplicações sem potencial de migração (set once, run forever) QUAL O PROJETO PARA ORMAN?