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. DESCOMPLICANDO ORM NO
    ANDROID COM ORMAN
    UBIRATAN SOARES
    DEVFEST-SP / 2012

    View full-size slide

  2. • Desenvolvedor Android e iOS
    • Alguns projetos
    SOBRE MIM
    • Hoje desenvolvedor na

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  7. • API ORM minimalista para MySQL e SQLite
    • Port para Android
    • Projeto maduro
    • Ótima documentação
    ORMAN
    https://github.com/ahmetalpbalkan/orman/

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  10. DECLARANDO UMA ENTITY
    @Entity(table = "constructions")
    public class Construction extends Model {
    @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 journals =
    new EntityList
    (Construction.class, Journal.class, this);
    }

    View full-size slide

  11. USANDO UMA ENTITY
    Construction itaquerao = new Construction( );
    itaquerao.insert( );
    itaquerao.doCoracao = true;
    itaquerao.update( );
    ...
    arenaSegundona.owner.seriaA = false;
    arenaSegundona.delete( );

    View full-size slide

  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

    View full-size slide

  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);
    }
    }

    View full-size slide

  14. EXECUTANDO CONSULTAS
    public List fetchByClient() {
    Query query = ModelQuery.select()
    .from(Construction.class)
    .orderBy(CLIENT_SORTING)
    .getQuery();
    return Construction.fetchQuery(query, Construction.class);
    }
    public List 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);
    }

    View full-size slide

  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

    View full-size slide

  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?

    View full-size slide

  17. ????
    DÚVIDAS?

    View full-size slide

  18. • @ubiratanfsoares
    • ubiratan.f.soares gmail.com
    • ubiratansoares.com.br
    • github.com/ubiratansoares
    VALEU!
    www.neo7apps.com.br
    (we are hiring! =D)

    View full-size slide