Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
ROOM: Biblioteca de Mapeamento Objeto-Relacional
Prof.FellipeAleixo([email protected])
Porque?
• Antesdemaisnada:porqueprecisamosdepersistêncianodisposi<vomóvel?
• (1º)paraaplicaçõesself-contained• (2º)para“cache”dedadosparausooff-line• (3º)parao<mizarousodarede
Room
• ObancodedadospadrãoparaaplicaçõesAndroidéoSQLite
• AbibliotecaRoomofereceumacamadadeabstraçãoparaotrabalhocomoSQLite
• Necessárioadicionarcomponentes(dearquitetura)aoseuprojeto
AdicionandoComponentes
• ComponentesdearquiteturaestãodisponíveisnorepositórioMavendaGoogle
• No“build.gradle”adicione:allprojects{repositories{jcenter()maven{url'h[ps://maven.google.com'}}}
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”
ComponentesPrincipaisdoRoom
1. Database– Usadoparacriarummanipuladorparaobanco– ClasseabstrataqueherdadeRoomDatabase
2. En,ty– Classesaserempersis<das
3. DAO– Classeouinterfacedeacessoaosdados
ComponentesPrincipaisdoRoom
Exemplo
• 1en<dade– User.java• 1DAO– UserDao.java• 1bancodedados– AppDatabase.java
En<ty@En2typublicclassUser{@PrimaryKeyprivateintuid;
@ColumnInfo(name="first_name")privateStringfirstName;
@ColumnInfo(name="last_name")privateStringlastName;//Ge[ersandse[ersareignoredforbrevity,//butthey'rerequiredforRoomtowork.}
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);}
BancodeDados
• Umainstânciaérecuperadaatravésde:
@Database(en22es={User.class},version=1)publicabstractclassAppDatabaseextendsRoomDatabase{publicabstractUserDaouserDao();}
AppDatabasedb=Room.databaseBuilder(getApplica<onContext(),AppDatabase.class,"database-name").build();
EMDETALHESDefinindoau<lizaçãodoRoom
DefinindoClassesdeEn<dade
• Anotadacom@En2tyelistadanoatributoen22esdaclassequedefineobanco
• PorpadrãooRoomcriaumacolunaparacadaatributodefinido
• Osatributosnãopersistentesdevemseranotadoscom@Ignore
• Cadaen<dadedeveterumdosseusatributosdefinidocomochaveprimária-@PrimaryKey
DefinindoClassesdeEn<dade
• Exemplo:@En2tyclassUser{@PrimaryKeypublicintid;
publicStringfirstName;publicStringlastName;
@IgnoreBitmappicture;}
DefinindoClassesdeEn<dade
• ORoompodegeraraschavesprimáriascomapropriedadeautoGenerateda@PrimaryKey
• Épossíveldefinirchavescompostas:@En2ty(primaryKeys={"firstName","lastName"})classUser{publicStringfirstName;publicStringlastName;
@IgnoreBitmappicture;}
DefinindoClassesdeEn<dade
• PorpadrãooRoomcriaumatabelacomonomedaclasse
• ÉpossívelespecificarumnomeatravésdapropriedadetableNameda@En2ty
@En2ty(tableName="users")classUser{...}
DefinindoClassesdeEn<dade
• Sevocêdesejarumnomedecolunadiferentenecessitausaraanotação@ColumnInfo
@En<ty(tableName="users")classUser{@PrimaryKeypublicintid;@ColumnInfo(name="first_name")publicStringfirstName;@ColumnInfo(name="last_name")publicStringlastName;}
ÍndiceseUnicidade@En2ty(indices={@Index(value={"first_name","last_name"},unique=true)})classUser{@PrimaryKeypublicintid;@ColumnInfo(name="first_name")publicStringfirstName;@ColumnInfo(name="last_name")publicStringlastName;@IgnoreBitmappicture;}
DefinindoRelacionamentos
• Roomnãopermiteorelacionamentoconvencionalentreclassesdeobjetos
• Permiteadefiniçãodechavesestrangeiras– Anotação@ForeingKey– Permitecascatearoperações,atravésdoatributoonDelete=CASCADEda@ForeingKey
DefinindoRelacionamentos
@En2ty(foreignKeys=@ForeignKey(en2ty=User.class,parentColumns="id",childColumns="user_id"))classBook{@PrimaryKeypublicintbookId;publicString<tle;@ColumnInfo(name="user_id")publicintuserId;}
DefinindoumDAO
• Podeserumaclasseabstrataouinterface– Anotadacom@Dao
• Permiteadefiniçãodemétodosde:– Inserção(insert)– Atualização(update)– Remoção(delete)– Consultas(query)
MétodosINSERT
• Anotadoscom@Insert@DaopublicinterfaceMyDao{@Insert(onConflict=OnConflictStrategy.REPLACE)publicvoidinsertUsers(User...users);
@InsertpublicvoidinsertBothUsers(Useruser1,Useruser2);
@InsertpublicvoidinsertUsersAndFriends(Useruser,List<User>friends);}
MétodosUPDATE
• Anotadoscom@Update
– Osobjetossãoiden<ficadospelachaveprimária
@DaopublicinterfaceMyDao{@UpdatepublicvoidupdateUsers(User...users);}
MétodosDELETE
• Anotadoscom@Delete
– Taismétodospodemretornaruminteirorepresentandoonúmeroderegistrosafetados
@DaopublicinterfaceMyDao{@DeletepublicvoiddeleteUsers(User...users);}
MétodosdeConsulta
• Anotadoscom@Query• Sãochecadasemtempodecompilação• Exemplodeconsultasimples:
@DaopublicinterfaceMyDao{@Query("SELECT*FROMuser")publicUser[]loadAllUsers();}
PassandoArgumentos
• Podemospassarparâmetrosnasconsultas
– Sinalizadosnaconsultasprecedidospor“:”– Devemcoincidircomosparâmetrosdométodo
@DaopublicinterfaceMyDao{@Query("SELECT*FROMuserWHEREage>:minAge")publicUser[]loadAllUsersOlderThan(intminAge);}
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);}
RetornandoSubconjuntodeColunas
• Quandosãonecessáriosapenaspartedosatributosdeumaen<dade
• Resultadospodemsermapeadosemobjetos
publicclassNameTuple{@ColumnInfo(name="first_name")publicStringfirstName;@ColumnInfo(name="last_name")publicStringlastName;}
RetornandoSubconjuntodeColunas
• Exemplo:
@DaopublicinterfaceMyDao{@Query("SELECTfirst_name,last_nameFROMuser")publicList<NameTuple>loadFullName();}
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);}
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();
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");}};
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