Pro Yearly is on sale from $80 to $50! »

Descomplicando ORM no Android com ORMAN

Descomplicando ORM no Android com ORMAN

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

D4b7a3e2ed10f86e0b52498713ba2601?s=128

Ubiratan Soares

November 30, 2012
Tweet

Transcript

  1. DESCOMPLICANDO ORM NO ANDROID COM ORMAN UBIRATAN SOARES DEVFEST-SP /

    2012
  2. • Desenvolvedor Android e iOS • Alguns projetos SOBRE MIM

    • Hoje desenvolvedor na
  3. • 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
  4. • 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
  5. • 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
  6. • 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
  7. • API ORM minimalista para MySQL e SQLite • Port

    para Android • Projeto maduro • Ótima documentação ORMAN https://github.com/ahmetalpbalkan/orman/
  8. • 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
  9. • Não oferece suporte à transações • Sem suporte à

    lazy loading • Não oferece API assíncrona • Não oferece suporte à migração LIMITAÇÕES
  10. 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); }
  11. USANDO UMA ENTITY Construction itaquerao = new Construction( ); itaquerao.insert(

    ); itaquerao.doCoracao = true; itaquerao.update( ); ... arenaSegundona.owner.seriaA = false; arenaSegundona.delete( );
  12. • 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
  13. 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); } }
  14. 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); }
  15. • 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
  16. • 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?
  17. ???? DÚVIDAS?

  18. • @ubiratanfsoares • ubiratan.f.soares <at> gmail.com • ubiratansoares.com.br • github.com/ubiratansoares

    VALEU! www.neo7apps.com.br (we are hiring! =D)