33
ROOM: Biblioteca de Mapeamento Objeto-Relacional Prof. Fellipe Aleixo ([email protected])

ROOM: Biblioteca de Mapeamento Objeto-Relacionaldiatinf.ifrn.edu.br/prof/lib/exe/fetch.php?media=user:... · 2017. 10. 19. · Room • O banco de dados padrão para aplicações

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: ROOM: Biblioteca de Mapeamento Objeto-Relacionaldiatinf.ifrn.edu.br/prof/lib/exe/fetch.php?media=user:... · 2017. 10. 19. · Room • O banco de dados padrão para aplicações

ROOM: Biblioteca de Mapeamento Objeto-Relacional

Prof.FellipeAleixo([email protected])

Page 2: ROOM: Biblioteca de Mapeamento Objeto-Relacionaldiatinf.ifrn.edu.br/prof/lib/exe/fetch.php?media=user:... · 2017. 10. 19. · Room • O banco de dados padrão para aplicações

Porque?

•  Antesdemaisnada:porqueprecisamosdepersistêncianodisposi<vomóvel?

•  (1º)paraaplicaçõesself-contained•  (2º)para“cache”dedadosparausooff-line•  (3º)parao<mizarousodarede

Page 3: ROOM: Biblioteca de Mapeamento Objeto-Relacionaldiatinf.ifrn.edu.br/prof/lib/exe/fetch.php?media=user:... · 2017. 10. 19. · Room • O banco de dados padrão para aplicações

Room

•  ObancodedadospadrãoparaaplicaçõesAndroidéoSQLite

•  AbibliotecaRoomofereceumacamadadeabstraçãoparaotrabalhocomoSQLite

•  Necessárioadicionarcomponentes(dearquitetura)aoseuprojeto

Page 4: ROOM: Biblioteca de Mapeamento Objeto-Relacionaldiatinf.ifrn.edu.br/prof/lib/exe/fetch.php?media=user:... · 2017. 10. 19. · Room • O banco de dados padrão para aplicações

AdicionandoComponentes

•  ComponentesdearquiteturaestãodisponíveisnorepositórioMavendaGoogle

•  No“build.gradle”adicione:allprojects{repositories{jcenter()maven{url'h[ps://maven.google.com'}}}

Page 5: ROOM: Biblioteca de Mapeamento Objeto-Relacionaldiatinf.ifrn.edu.br/prof/lib/exe/fetch.php?media=user:... · 2017. 10. 19. · Room • O banco de dados padrão para aplicações

AdicionandoComponentes

•  Dependênciasnecessárias:–  implementa<on"android.arch.persistence.room:run2me:1.0.0-beta2”

– annota<onProcessor"android.arch.persistence.room:compiler:1.0.0-beta2”

Page 6: ROOM: Biblioteca de Mapeamento Objeto-Relacionaldiatinf.ifrn.edu.br/prof/lib/exe/fetch.php?media=user:... · 2017. 10. 19. · Room • O banco de dados padrão para aplicações

ComponentesPrincipaisdoRoom

1.  Database–  Usadoparacriarummanipuladorparaobanco–  ClasseabstrataqueherdadeRoomDatabase

2.  En,ty–  Classesaserempersis<das

3.   DAO–  Classeouinterfacedeacessoaosdados

Page 7: ROOM: Biblioteca de Mapeamento Objeto-Relacionaldiatinf.ifrn.edu.br/prof/lib/exe/fetch.php?media=user:... · 2017. 10. 19. · Room • O banco de dados padrão para aplicações

ComponentesPrincipaisdoRoom

Page 8: ROOM: Biblioteca de Mapeamento Objeto-Relacionaldiatinf.ifrn.edu.br/prof/lib/exe/fetch.php?media=user:... · 2017. 10. 19. · Room • O banco de dados padrão para aplicações

Exemplo

•  1en<dade– User.java•  1DAO– UserDao.java•  1bancodedados– AppDatabase.java

Page 9: ROOM: Biblioteca de Mapeamento Objeto-Relacionaldiatinf.ifrn.edu.br/prof/lib/exe/fetch.php?media=user:... · 2017. 10. 19. · Room • O banco de dados padrão para aplicações

En<ty@En2typublicclassUser{@PrimaryKeyprivateintuid;

@ColumnInfo(name="first_name")privateStringfirstName;

@ColumnInfo(name="last_name")privateStringlastName;//Ge[ersandse[ersareignoredforbrevity,//butthey'rerequiredforRoomtowork.}

Page 10: ROOM: Biblioteca de Mapeamento Objeto-Relacionaldiatinf.ifrn.edu.br/prof/lib/exe/fetch.php?media=user:... · 2017. 10. 19. · Room • O banco de dados padrão para aplicações

DAO@DaopublicinterfaceUserDao{@Query("SELECT*FROMuser")List<User>getAll();@Query("SELECT*FROMuserWHEREuidIN(:userIds)")List<User>loadAllByIds(int[]userIds);@Query("SELECT*FROMuserWHEREfirst_nameLIKE:first"+"ANDlast_nameLIKE:lastLIMIT1")UserfindByName(Stringfirst,Stringlast);@InsertvoidinsertAll(User...users);@Deletevoiddelete(Useruser);}

Page 11: ROOM: Biblioteca de Mapeamento Objeto-Relacionaldiatinf.ifrn.edu.br/prof/lib/exe/fetch.php?media=user:... · 2017. 10. 19. · Room • O banco de dados padrão para aplicações

BancodeDados

•  Umainstânciaérecuperadaatravésde:

@Database(en22es={User.class},version=1)publicabstractclassAppDatabaseextendsRoomDatabase{publicabstractUserDaouserDao();}

AppDatabasedb=Room.databaseBuilder(getApplica<onContext(),AppDatabase.class,"database-name").build();

Page 12: ROOM: Biblioteca de Mapeamento Objeto-Relacionaldiatinf.ifrn.edu.br/prof/lib/exe/fetch.php?media=user:... · 2017. 10. 19. · Room • O banco de dados padrão para aplicações

EMDETALHESDefinindoau<lizaçãodoRoom

Page 13: ROOM: Biblioteca de Mapeamento Objeto-Relacionaldiatinf.ifrn.edu.br/prof/lib/exe/fetch.php?media=user:... · 2017. 10. 19. · Room • O banco de dados padrão para aplicações

DefinindoClassesdeEn<dade

•  Anotadacom@En2tyelistadanoatributoen22esdaclassequedefineobanco

•  PorpadrãooRoomcriaumacolunaparacadaatributodefinido

•  Osatributosnãopersistentesdevemseranotadoscom@Ignore

•  Cadaen<dadedeveterumdosseusatributosdefinidocomochaveprimária-@PrimaryKey

Page 14: ROOM: Biblioteca de Mapeamento Objeto-Relacionaldiatinf.ifrn.edu.br/prof/lib/exe/fetch.php?media=user:... · 2017. 10. 19. · Room • O banco de dados padrão para aplicações

DefinindoClassesdeEn<dade

•  Exemplo:@En2tyclassUser{@PrimaryKeypublicintid;

publicStringfirstName;publicStringlastName;

@IgnoreBitmappicture;}

Page 15: ROOM: Biblioteca de Mapeamento Objeto-Relacionaldiatinf.ifrn.edu.br/prof/lib/exe/fetch.php?media=user:... · 2017. 10. 19. · Room • O banco de dados padrão para aplicações

DefinindoClassesdeEn<dade

•  ORoompodegeraraschavesprimáriascomapropriedadeautoGenerateda@PrimaryKey

•  Épossíveldefinirchavescompostas:@En2ty(primaryKeys={"firstName","lastName"})classUser{publicStringfirstName;publicStringlastName;

@IgnoreBitmappicture;}

Page 16: ROOM: Biblioteca de Mapeamento Objeto-Relacionaldiatinf.ifrn.edu.br/prof/lib/exe/fetch.php?media=user:... · 2017. 10. 19. · Room • O banco de dados padrão para aplicações

DefinindoClassesdeEn<dade

•  PorpadrãooRoomcriaumatabelacomonomedaclasse

•  ÉpossívelespecificarumnomeatravésdapropriedadetableNameda@En2ty

@En2ty(tableName="users")classUser{...}

Page 17: ROOM: Biblioteca de Mapeamento Objeto-Relacionaldiatinf.ifrn.edu.br/prof/lib/exe/fetch.php?media=user:... · 2017. 10. 19. · Room • O banco de dados padrão para aplicações

DefinindoClassesdeEn<dade

•  Sevocêdesejarumnomedecolunadiferentenecessitausaraanotação@ColumnInfo

@En<ty(tableName="users")classUser{@PrimaryKeypublicintid;@ColumnInfo(name="first_name")publicStringfirstName;@ColumnInfo(name="last_name")publicStringlastName;}

Page 18: ROOM: Biblioteca de Mapeamento Objeto-Relacionaldiatinf.ifrn.edu.br/prof/lib/exe/fetch.php?media=user:... · 2017. 10. 19. · Room • O banco de dados padrão para aplicações

ÍndiceseUnicidade@En2ty(indices={@Index(value={"first_name","last_name"},unique=true)})classUser{@PrimaryKeypublicintid;@ColumnInfo(name="first_name")publicStringfirstName;@ColumnInfo(name="last_name")publicStringlastName;@IgnoreBitmappicture;}

Page 19: ROOM: Biblioteca de Mapeamento Objeto-Relacionaldiatinf.ifrn.edu.br/prof/lib/exe/fetch.php?media=user:... · 2017. 10. 19. · Room • O banco de dados padrão para aplicações

DefinindoRelacionamentos

•  Roomnãopermiteorelacionamentoconvencionalentreclassesdeobjetos

•  Permiteadefiniçãodechavesestrangeiras– Anotação@ForeingKey– Permitecascatearoperações,atravésdoatributoonDelete=CASCADEda@ForeingKey

Page 20: ROOM: Biblioteca de Mapeamento Objeto-Relacionaldiatinf.ifrn.edu.br/prof/lib/exe/fetch.php?media=user:... · 2017. 10. 19. · Room • O banco de dados padrão para aplicações

DefinindoRelacionamentos

@En2ty(foreignKeys=@ForeignKey(en2ty=User.class,parentColumns="id",childColumns="user_id"))classBook{@PrimaryKeypublicintbookId;publicString<tle;@ColumnInfo(name="user_id")publicintuserId;}

Page 21: ROOM: Biblioteca de Mapeamento Objeto-Relacionaldiatinf.ifrn.edu.br/prof/lib/exe/fetch.php?media=user:... · 2017. 10. 19. · Room • O banco de dados padrão para aplicações

DefinindoumDAO

•  Podeserumaclasseabstrataouinterface– Anotadacom@Dao

•  Permiteadefiniçãodemétodosde:–  Inserção(insert)– Atualização(update)– Remoção(delete)– Consultas(query)

Page 22: ROOM: Biblioteca de Mapeamento Objeto-Relacionaldiatinf.ifrn.edu.br/prof/lib/exe/fetch.php?media=user:... · 2017. 10. 19. · Room • O banco de dados padrão para aplicações

MétodosINSERT

•  Anotadoscom@Insert@DaopublicinterfaceMyDao{@Insert(onConflict=OnConflictStrategy.REPLACE)publicvoidinsertUsers(User...users);

@InsertpublicvoidinsertBothUsers(Useruser1,Useruser2);

@InsertpublicvoidinsertUsersAndFriends(Useruser,List<User>friends);}

Page 23: ROOM: Biblioteca de Mapeamento Objeto-Relacionaldiatinf.ifrn.edu.br/prof/lib/exe/fetch.php?media=user:... · 2017. 10. 19. · Room • O banco de dados padrão para aplicações

MétodosUPDATE

•  Anotadoscom@Update

– Osobjetossãoiden<ficadospelachaveprimária

@DaopublicinterfaceMyDao{@UpdatepublicvoidupdateUsers(User...users);}

Page 24: ROOM: Biblioteca de Mapeamento Objeto-Relacionaldiatinf.ifrn.edu.br/prof/lib/exe/fetch.php?media=user:... · 2017. 10. 19. · Room • O banco de dados padrão para aplicações

MétodosDELETE

•  Anotadoscom@Delete

– Taismétodospodemretornaruminteirorepresentandoonúmeroderegistrosafetados

@DaopublicinterfaceMyDao{@DeletepublicvoiddeleteUsers(User...users);}

Page 25: ROOM: Biblioteca de Mapeamento Objeto-Relacionaldiatinf.ifrn.edu.br/prof/lib/exe/fetch.php?media=user:... · 2017. 10. 19. · Room • O banco de dados padrão para aplicações

MétodosdeConsulta

•  Anotadoscom@Query•  Sãochecadasemtempodecompilação•  Exemplodeconsultasimples:

@DaopublicinterfaceMyDao{@Query("SELECT*FROMuser")publicUser[]loadAllUsers();}

Page 26: ROOM: Biblioteca de Mapeamento Objeto-Relacionaldiatinf.ifrn.edu.br/prof/lib/exe/fetch.php?media=user:... · 2017. 10. 19. · Room • O banco de dados padrão para aplicações

PassandoArgumentos

•  Podemospassarparâmetrosnasconsultas

– Sinalizadosnaconsultasprecedidospor“:”– Devemcoincidircomosparâmetrosdométodo

@DaopublicinterfaceMyDao{@Query("SELECT*FROMuserWHEREage>:minAge")publicUser[]loadAllUsersOlderThan(intminAge);}

Page 27: ROOM: Biblioteca de Mapeamento Objeto-Relacionaldiatinf.ifrn.edu.br/prof/lib/exe/fetch.php?media=user:... · 2017. 10. 19. · Room • O banco de dados padrão para aplicações

PassandoArgumentos

•  Passandomúl<plosparâmetros@DaopublicinterfaceMyDao{@Query("SELECT*FROMuserWHEREageBETWEEN:minAge“

+“AND:maxAge")publicUser[]loadAllUsersBetweenAges(intminAge,intmaxAge);@Query("SELECT*FROMuserWHEREfirst_nameLIKE:search" +"ORlast_nameLIKE:search")publicList<User>findUserWithName(Stringsearch);}

Page 28: ROOM: Biblioteca de Mapeamento Objeto-Relacionaldiatinf.ifrn.edu.br/prof/lib/exe/fetch.php?media=user:... · 2017. 10. 19. · Room • O banco de dados padrão para aplicações

RetornandoSubconjuntodeColunas

•  Quandosãonecessáriosapenaspartedosatributosdeumaen<dade

•  Resultadospodemsermapeadosemobjetos

publicclassNameTuple{@ColumnInfo(name="first_name")publicStringfirstName;@ColumnInfo(name="last_name")publicStringlastName;}

Page 29: ROOM: Biblioteca de Mapeamento Objeto-Relacionaldiatinf.ifrn.edu.br/prof/lib/exe/fetch.php?media=user:... · 2017. 10. 19. · Room • O banco de dados padrão para aplicações

RetornandoSubconjuntodeColunas

•  Exemplo:

@DaopublicinterfaceMyDao{@Query("SELECTfirst_name,last_nameFROMuser")publicList<NameTuple>loadFullName();}

Page 30: ROOM: Biblioteca de Mapeamento Objeto-Relacionaldiatinf.ifrn.edu.br/prof/lib/exe/fetch.php?media=user:... · 2017. 10. 19. · Room • O banco de dados padrão para aplicações

ConsultandoMúl<plasTabelas

•  U<lizaçãodeJOIN@DaopublicinterfaceMyDao{@Query("SELECT*FROMbook"+"INNERJOINloanONloan.book_id=book.id"+"INNERJOINuserONuser.id=loan.user_id"+"WHEREuser.nameLIKE:userName")publicList<Book>findBooksBorrowedByName(StringuserName);}

Page 31: ROOM: Biblioteca de Mapeamento Objeto-Relacionaldiatinf.ifrn.edu.br/prof/lib/exe/fetch.php?media=user:... · 2017. 10. 19. · Room • O banco de dados padrão para aplicações

MigraçãodoBancodeDados

•  Necessáriasparaaatualizaçãodobanco•  Devemsercriadasclassesdemigração– Métodoasersobrecarregado– migrate– Exemplo:

Room.databaseBuilder(getApplica<onContext(),MyDb.class,"database-name”).addMigra<ons(MIGRATION_1_2,MIGRATION_2_3).build();

Page 32: ROOM: Biblioteca de Mapeamento Objeto-Relacionaldiatinf.ifrn.edu.br/prof/lib/exe/fetch.php?media=user:... · 2017. 10. 19. · Room • O banco de dados padrão para aplicações

sta<cfinalMigra<onMIGRATION_1_2=newMigra<on(1,2){@Overridepublicvoidmigrate(SupportSQLiteDatabasedatabase){database.execSQL("CREATETABLE`Fruit`(`id`INTEGER,"+"`name`TEXT,PRIMARYKEY(`id`))");}};sta<cfinalMigra<onMIGRATION_2_3=newMigra<on(2,3){@Overridepublicvoidmigrate(SupportSQLiteDatabasedatabase){database.execSQL("ALTERTABLEBook"+"ADDCOLUMNpub_yearINTEGER");}};

Page 33: ROOM: Biblioteca de Mapeamento Objeto-Relacionaldiatinf.ifrn.edu.br/prof/lib/exe/fetch.php?media=user:... · 2017. 10. 19. · Room • O banco de dados padrão para aplicações

Referências

•  AndroidparaProgramadores–Umaabordagembaseadaemaplica<vos.PaulDeitel...[etal.].Bookman,2013

•  RoomPersistenceLibraryh[ps://developer.android.com/topic/libraries/architecture/room.html

•  h[p://developer.android.com/reference