ROOM: Biblioteca de Mapeamento...
Transcript of ROOM: Biblioteca de Mapeamento...
![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](https://reader036.fdocumentos.tips/reader036/viewer/2022071410/6105c9f5921dbd082e6411c3/html5/thumbnails/2.jpg)
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](https://reader036.fdocumentos.tips/reader036/viewer/2022071410/6105c9f5921dbd082e6411c3/html5/thumbnails/3.jpg)
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](https://reader036.fdocumentos.tips/reader036/viewer/2022071410/6105c9f5921dbd082e6411c3/html5/thumbnails/4.jpg)
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](https://reader036.fdocumentos.tips/reader036/viewer/2022071410/6105c9f5921dbd082e6411c3/html5/thumbnails/5.jpg)
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](https://reader036.fdocumentos.tips/reader036/viewer/2022071410/6105c9f5921dbd082e6411c3/html5/thumbnails/6.jpg)
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](https://reader036.fdocumentos.tips/reader036/viewer/2022071410/6105c9f5921dbd082e6411c3/html5/thumbnails/7.jpg)
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](https://reader036.fdocumentos.tips/reader036/viewer/2022071410/6105c9f5921dbd082e6411c3/html5/thumbnails/8.jpg)
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](https://reader036.fdocumentos.tips/reader036/viewer/2022071410/6105c9f5921dbd082e6411c3/html5/thumbnails/9.jpg)
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](https://reader036.fdocumentos.tips/reader036/viewer/2022071410/6105c9f5921dbd082e6411c3/html5/thumbnails/10.jpg)
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](https://reader036.fdocumentos.tips/reader036/viewer/2022071410/6105c9f5921dbd082e6411c3/html5/thumbnails/11.jpg)
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](https://reader036.fdocumentos.tips/reader036/viewer/2022071410/6105c9f5921dbd082e6411c3/html5/thumbnails/12.jpg)
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](https://reader036.fdocumentos.tips/reader036/viewer/2022071410/6105c9f5921dbd082e6411c3/html5/thumbnails/13.jpg)
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](https://reader036.fdocumentos.tips/reader036/viewer/2022071410/6105c9f5921dbd082e6411c3/html5/thumbnails/14.jpg)
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](https://reader036.fdocumentos.tips/reader036/viewer/2022071410/6105c9f5921dbd082e6411c3/html5/thumbnails/15.jpg)
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](https://reader036.fdocumentos.tips/reader036/viewer/2022071410/6105c9f5921dbd082e6411c3/html5/thumbnails/16.jpg)
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](https://reader036.fdocumentos.tips/reader036/viewer/2022071410/6105c9f5921dbd082e6411c3/html5/thumbnails/17.jpg)
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](https://reader036.fdocumentos.tips/reader036/viewer/2022071410/6105c9f5921dbd082e6411c3/html5/thumbnails/18.jpg)
Í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](https://reader036.fdocumentos.tips/reader036/viewer/2022071410/6105c9f5921dbd082e6411c3/html5/thumbnails/19.jpg)
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](https://reader036.fdocumentos.tips/reader036/viewer/2022071410/6105c9f5921dbd082e6411c3/html5/thumbnails/20.jpg)
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](https://reader036.fdocumentos.tips/reader036/viewer/2022071410/6105c9f5921dbd082e6411c3/html5/thumbnails/21.jpg)
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](https://reader036.fdocumentos.tips/reader036/viewer/2022071410/6105c9f5921dbd082e6411c3/html5/thumbnails/22.jpg)
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](https://reader036.fdocumentos.tips/reader036/viewer/2022071410/6105c9f5921dbd082e6411c3/html5/thumbnails/23.jpg)
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](https://reader036.fdocumentos.tips/reader036/viewer/2022071410/6105c9f5921dbd082e6411c3/html5/thumbnails/24.jpg)
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](https://reader036.fdocumentos.tips/reader036/viewer/2022071410/6105c9f5921dbd082e6411c3/html5/thumbnails/25.jpg)
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](https://reader036.fdocumentos.tips/reader036/viewer/2022071410/6105c9f5921dbd082e6411c3/html5/thumbnails/26.jpg)
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](https://reader036.fdocumentos.tips/reader036/viewer/2022071410/6105c9f5921dbd082e6411c3/html5/thumbnails/27.jpg)
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](https://reader036.fdocumentos.tips/reader036/viewer/2022071410/6105c9f5921dbd082e6411c3/html5/thumbnails/28.jpg)
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](https://reader036.fdocumentos.tips/reader036/viewer/2022071410/6105c9f5921dbd082e6411c3/html5/thumbnails/29.jpg)
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](https://reader036.fdocumentos.tips/reader036/viewer/2022071410/6105c9f5921dbd082e6411c3/html5/thumbnails/30.jpg)
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](https://reader036.fdocumentos.tips/reader036/viewer/2022071410/6105c9f5921dbd082e6411c3/html5/thumbnails/31.jpg)
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](https://reader036.fdocumentos.tips/reader036/viewer/2022071410/6105c9f5921dbd082e6411c3/html5/thumbnails/32.jpg)
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](https://reader036.fdocumentos.tips/reader036/viewer/2022071410/6105c9f5921dbd082e6411c3/html5/thumbnails/33.jpg)
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