рдХрдХреНрд╖ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 7 рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрд╕

рдХрдХреНрд╖ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 7 рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрд╕


рдХрдорд░рд╛ SQLite рдХреЗ рдКрдкрд░ рдПрдХ рдЕрдореВрд░реНрдд рдкрд░рдд рд╣реИ рдЬреЛ рднрдВрдбрд╛рд░рдг рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдХрдХреНрд╖ рдореЗрдВ рдирдП рд╣реИрдВ, рддреЛ рдЗрд╕ рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ рд▓реЗрдЦ рдХреЛ рджреЗрдЦреЗрдВ:


рдХрдХреНрд╖ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 7 рдХрджрдоред рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЛ рдХрдорд░реЗ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реЙрдХрдереНрд░реВ

рдФрд░ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдХреБрдЫ рдпреБрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдХрдорд░реЗ рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПред


1. рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдкреНрд░реА-рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд░рдирд╛


рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдпрд╛ рдЗрд╕рдХреЗ рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рдордп рдЕрдкрдиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдбреЗрдЯрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? RoomDatabase # Callback рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЕрдкрдирд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рддреЗ рд╕рдордп AddCallback рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ рдФрд░ onCreate рдпрд╛ onOpen рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдВред


рдЬрдм рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд╣рд▓реА рдмрд╛рд░ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ onCreate рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЬрдм рдбреЗрдЯрд╛рдмреЗрд╕ рдЦреЛрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ onOpen рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдЗрди рддрд░реАрдХреЛрдВ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╣реА DAO рддрдХ рдкрд╣реБрдВрдЪ рд╕рдВрднрд╡ рд╣реИ, рд╣рдо рдПрдХ рдирдИ рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рд▓рд┐рдВрдХ рдорд┐рд▓рддрд╛ рд╣реИ, рдлрд┐рд░ рд╣рдо DAO рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдбрд╛рд▓рддреЗ рд╣реИрдВред


 Room.databaseBuilder(context.applicationContext, DataDatabase::class.java, "Sample.db") // prepopulate the database after onCreate was called .addCallback(object : Callback() { override fun onCreate(db: SupportSQLiteDatabase) { super.onCreate(db) // moving to a new thread ioThread { getInstance(context).dataDao() .insert(PREPOPULATE_DATA) } } }) .build() 

рдкреВрд░рд╛ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВред


рдиреЛрдЯ: рдпрджрд┐ рдЖрдк ioThread рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд╣рд▓реА рдмрд╛рд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдиреЗ рдФрд░ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмреАрдЪ, рдбреЗрдЯрд╛ рдХрднреА рднреА рд╕рдореНрдорд┐рд▓рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред


2. DAO рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


рдХреНрдпрд╛ рдЖрдкрдХреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдХрдИ рдЯреЗрдмрд▓ рд╣реИрдВ рдФрд░ рдПрдХ рд╣реА рдЗрдВрд╕рд░реНрдЯ , рдЕрдкрдбреЗрдЯ рдФрд░ рдбрд┐рд▓реАрдЯ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрдкреА рдХрд░рддреЗ рд╣реИрдВ? BaseDao<T> рд╡рд┐рд░рд╛рд╕рдд рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдПрдХ BaseDao<T> рдХреНрд▓рд╛рд╕ @Update рдФрд░ @Delete рдЕрдкрдиреЗ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЛрдВ @Insert , @Update рдФрд░ @Delete рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред рдкреНрд░рддреНрдпреЗрдХ рдбреАрдПрдУ рдХреЛ BaseDao рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ BaseDao рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд░реАрдХреЗ рдЬреЛрдбрд╝реЗрдВред


 interface BaseDao<T> { @Insert fun insert(vararg obj: T) } @Dao abstract class DataDao : BaseDao<Data>() { @Query("SELECT * FROM Data") abstract fun getData(): List<Data> } 

рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ рд╡рд┐рд╡рд░рдг


DAO рдХрд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдпрд╛ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдХрдХреНрд╖ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЙрдирдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ BaseDao рддрд░реАрдХреЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред


3. рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛрдб рдХреЗ рдмрд┐рдирд╛ рд▓реЗрдирджреЗрди рдореЗрдВ рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди


@Transaction рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╕рднреА рдбреЗрдЯрд╛рдмреЗрд╕ рдСрдкрд░реЗрд╢рди рдПрдХ рд╣реА рд▓реЗрдирджреЗрди рдХреЗ рднреАрддрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд╡рд┐рдзрд┐ рдмреЙрдбреА рдореЗрдВ рдЕрдкрд╡рд╛рдж рд╣реЛрдиреЗ рдкрд░ рд▓реЗрди-рджреЗрди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


 @Dao abstract class UserDao { @Transaction open fun updateData(users: List<User>) { deleteAllUsers() insertAll(users) } @Insert abstract fun insertAll(users: List<User>) @Query("DELETE FROM Users") abstract fun deleteAllUsers() } 

рдЖрдк рдорд╛рдорд▓реЛрдВ рдореЗрдВ select рдХрдерди select рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ @Transaction рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП @Transaction рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВ:


  • рдЬрдм рдХреНрд╡реЗрд░реА рдкрд░рд┐рдгрд╛рдо рдХрд╛рдлреА рдмрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИред рдПрдХ рд▓реЗрди-рджреЗрди рдореЗрдВ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рд╕реЗ, рдЖрдк рдЧрд╛рд░рдВрдЯреА рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдпрджрд┐ рдЕрдиреБрд░реЛрдз рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдХрд░реНрд╕рд░ рдХреЗ рдПрдХ "рд╣рд┐рд╕реНрд╕реЗ" рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХрд░реНрд╕рд░ рдХреЗ рдХреНрд░рдордкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдХрд╛рд░рдг рдХреНрд╖рддрд┐рдЧреНрд░рд╕реНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
  • рдЬрдм рдХреНрд╡реЗрд░реА рдкрд░рд┐рдгрд╛рдо @Relation рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рдПрдХ POJO рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╖реЗрддреНрд░ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдЕрдиреБрд░реЛрдз рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдПрдХ рд▓реЗрдирджреЗрди рдореЗрдВ рдЪрд▓рд╛рдиреЗ рд╕реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдмреАрдЪ рд▓рдЧрд╛рддрд╛рд░ рдкрд░рд┐рдгрд╛рдо рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред

@Delete , @Update рдФрд░ @Insert , рдЬрд┐рд╕рдореЗрдВ рдХрдИ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓реЗрди-рджреЗрди рдХреЗ рдЕрдВрджрд░ рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред


4. рдХреЗрд╡рд▓ рд╡рд╣реА рдкрдврд╝рдирд╛ рдЬреЛ рдЖрдкрдХреЛ рдЪрд╛рд╣рд┐рдП


рдЬрдм рдЖрдк рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреНрдпрд╛ рдЖрдк рдЙрди рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдорд┐рд▓рддреЗ рд╣реИрдВ? рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдореЗрдореЛрд░реА рдХреА рдорд╛рддреНрд░рд╛ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦреЗрдВ, рдФрд░ рдХреЗрд╡рд▓ рдЙрди рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдЕрдВрддрддрдГ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдпрд╣ I / O рдХреА рд▓рд╛рдЧрдд рдХреЛ рдХрдо рдХрд░рдХреЗ рдЖрдкрдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рдЧрддрд┐ рднреА рдмрдврд╝рд╛рдПрдЧрд╛ред рдХрдХреНрд╖ рдЖрдкрдХреЗ рд▓рд┐рдП рдХреЙрд▓рдо рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдмреАрдЪ рдореИрдкрд┐рдВрдЧ рдХрд░реЗрдЧрд╛ред


рдЗрд╕ рдЬрдЯрд┐рд▓ User рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:


 @Entity(tableName = "users") data class User(@PrimaryKey val id: String, val userName: String, val firstName: String, val lastName: String, val email: String, val dateOfBirth: Date, val registrationDate: Date) 

рдХреБрдЫ рд╕реНрдХреНрд░реАрди рдкрд░ рд╣рдореЗрдВ рдпрд╣ рд╕рдм рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдПрдХ UserMinimal рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рд╣реЛрддрд╛ рд╣реИред


 data class UserMinimal(val userId: String, val firstName: String, val lastName: String) 

DAO рд╡рд░реНрдЧ рдореЗрдВ, рд╣рдо рдХреНрд╡реЗрд░реА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ users рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рд╕рд╣реА рдХреЙрд▓рдо рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВред


 @Dao interface UserDao { @Query(тАЬSELECT userId, firstName, lastName FROM Users) fun getUsersMinimal(): List<UserMinimal> } 

5. рд╡рд┐рджреЗрд╢реА рдЪрд╛рдмрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рдмреАрдЪ рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдирд┐рдпрдВрддреНрд░рдг


рднрд▓реЗ рд╣реА рдХрдХреНрд╖ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдзреЛрдВ рдХрд╛ рд╕реАрдзреЗ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдЖрдкрдХреЛ рд╡рд┐рджреЗрд╢реА рдХреБрдВрдЬрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдмреАрдЪ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред


рдХрдорд░реЗ рдореЗрдВ @ForeignKey рдПрдиреЛрдЯреЗрд╢рди рд╣реИ, рдЬреЛ @Entity рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореЗрдВ, рдпрд╣ SQLite рдореЗрдВ рд╡рд┐рджреЗрд╢реА рдХреБрдВрдЬреА рдХреЗ рд╕рдорд╛рди рд╣реИред рдЬрдм рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдзреЛрдВ рдХреЗ рд╕рдВрд░рдХреНрд╖рдг рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИред рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдВрджрд░реНрднрд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ, рд╕рд╛рде рд╣реА рд╡рд░реНрддрдорд╛рди рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреЙрд▓рдо рдФрд░ рдЬрд┐рд╕ рд╡реЙрд▓реНрдпреВрдо рдХреЛ рдЖрдк рд╕рдВрджрд░реНрднрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред


рд╡рд░реНрдЧ User рдФрд░ Pet рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред Pet рдкрд╛рд╕ рдПрдХ рдорд╛рд▓рд┐рдХ рд╣реИ - рд╡рд┐рджреЗрд╢реА рдХреБрдВрдЬреА рджреНрд╡рд╛рд░рд╛ рд╕рдВрджрд░реНрднрд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдИрдбреАред


 @Entity(tableName = "pets", foreignKeys = arrayOf( ForeignKey(entity = User::class, parentColumns = arrayOf("userId"), childColumns = arrayOf("owner")))) data class Pet(@PrimaryKey val petId: String, val name: String, val owner: String) 

рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рдЖрдк рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЛ рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рдпрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдХреНрдпрд╛ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдЬрд╛рдПред рдЖрдк рдирд┐рдореНрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ: NO_ACTION , RESTRICT , SET_NULL , SET_DEFAULT рдпрд╛ CASCADE , рдЬреЛ SQLite рдХреЗ рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВред


рдиреЛрдЯ: рдХрдХреНрд╖ рдореЗрдВ, SET_DEFAULT рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрдХреНрд╖ рдЖрдкрдХреЛ рдЕрднреА рддрдХ рдХреЙрд▓рдо рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред


6. @Relation рдХреЗ рд╕рд╛рде рдПрдХ рд╕реЗ рдХрдИ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдПрдВ


рдкрд┐рдЫрд▓реЗ User - Pet рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ-рд╕реЗ-рдХрдИ рд╕рдВрдмрдВрдз рд╣реИрдВ: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдХрдИ рдкрд╛рд▓рддреВ рдЬрд╛рдирд╡рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдкрд╛рд▓рддреВ рдЬрд╛рдирд╡рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ: List<UserAndAllPets> ред


 data class UserAndAllPets (val user: User, val pets: List<Pet> = ArrayList()) 

рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ 2 рдкреНрд░рд╢реНрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдПрдХ рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рджреВрд╕рд░рд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдИрдбреА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкрд╛рд▓рддреВ рдЬрд╛рдирд╡рд░реЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред


 @Query(тАЬSELECT * FROM UsersтАЭ) public List<User> getUsers(); @Query(тАЬSELECT * FROM Pets where owner = :userIdтАЭ) public List<Pet> getPetsForUser(String userId); 

рдлрд┐рд░ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╣рд░ рдмрд╛рд░ Pets рдЯреЗрдмрд▓ рддрдХ Pets ред


@Relation рдПрдиреЛрдЯреЗрд╢рди рд╣рдорд╛рд░реЗ рдЬреАрд╡рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрдЧрд╛: рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдЧрд╛ред @Relation List Set List рдпрд╛ Set рд▓рд╛рдЧреВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред UserAndAllPets рд╡рд░реНрдЧ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ:


 class UserAndAllPets { @Embedded var user: User? = null @Relation(parentColumn = тАЬuserIdтАЭ, entityColumn = тАЬownerтАЭ) var pets: List<Pet> = ArrayList() } 

DAO рдореЗрдВ, рд╣рдо рдПрдХ рдХреНрд╡реЗрд░реА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдХрдХреНрд╖ Users рдФрд░ Pets рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдХреНрд╡реЗрд░реА рдХрд░реЗрдЧрд╛ рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЕрдкрдиреЗ рдЖрдк рд╕реЗ рдореИрдк рдХрд░реЗрдЧрд╛ред


 @Transaction @Query(тАЬSELECT * FROM UsersтАЭ) List<UserAndAllPets> getUsers(); 

7. рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдЭреВрдареА рд╕реВрдЪрдирд╛рдУрдВ рд╕реЗ рдмрдЪрдирд╛


рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдк рдХрд┐рд╕реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЙрд╕рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдЕрд╡рд▓реЛрдХрдиреАрдп рдЕрдиреБрд░реЛрдз рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:


 @Query(тАЬSELECT * FROM Users WHERE userId = :id) fun getUserById(id: String): LiveData<User> // or @Query(тАЬSELECT * FROM Users WHERE userId = :id) fun getUserById(id: String): Flowable<User> 

рд╣рд░ рдмрд╛рд░ рдЕрдкрдбреЗрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЖрдкрдХреЛ рдПрдХ рдирдпрд╛ User рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрдкрдХреЛ рддрдм рднреА рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ рдЬрдм Users рддрд╛рд▓рд┐рдХрд╛ (рд╣рдЯрд╛рдП рдЧрдП, рдЕрдкрдбреЗрдЯ, рдпрд╛ рдЖрд╡реЗрд╖рдг) рдореЗрдВ рдЕрдиреНрдп рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЧрд▓рдд рд╕реВрдЪрдирд╛рдПрдВ рдЖрдПрдВрдЧреАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЖрдкрдХреА рдХреНрд╡реЗрд░реА рдореЗрдВ рдХрдИ рддрд╛рд▓рд┐рдХрд╛рдПрдБ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рддреЛ рдЖрдк рдирдП рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ рдЬрдм рднреА рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдореЗрдВ рдХреБрдЫ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдЧрд╛ред


рдпрд╣рд╛рдВ рдЬрд╛рдирд┐рдП рдкрд░реНрджреЗ рдХреЗ рдкреАрдЫреЗ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:


  1. рдЬрдм рднреА DELETE , UPDATE рдпрд╛ INSERT рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ UPDATE рддреЛ SQLite рдЙрд╕ рдЖрдЧ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИред
  2. рдХрдХреНрд╖ рдПрдХ Inv рдЕрдорд╛рдиреНрдпationTracker рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ Observers рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЕрд╡рд▓реЛрдХрди рдХрд┐рдП рдЧрдП рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рддрд╛ рд╣реИред
  3. LiveData рдФрд░ Flowable рджреЛрдиреЛрдВ рдЕрдиреБрд░реЛрдз InvalidationTracker.Observer # onInvalidated рд╕реВрдЪрдирд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВред рдЬрдм рдпрд╣ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдПрдХ рджреЛрд╣рд░рд╛рдпрд╛ рдЕрдиреБрд░реЛрдз рд╣реЛрддрд╛ рд╣реИред

рдХрдорд░рд╛ рдХреЗрд╡рд▓ рдпрд╣ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рддрд╛рд▓рд┐рдХрд╛ рдмрджрд▓ рджреА рдЧрдИ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдХреНрдпреЛрдВ рдФрд░ рдХреНрдпрд╛ рдмрджрд▓ рдЧрдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдПрдХ рджреВрд╕рд░реЗ рдЕрдиреБрд░реЛрдз рдХреЗ рдмрд╛рдж, рдЕрдиреБрд░реЛрдз рдХрд╛ рдкрд░рд┐рдгрд╛рдо LiveData рдпрд╛ Flowable рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд┐рдпрд╛ Flowable ред рдХреНрдпреЛрдВрдХрд┐ рдХрдХреНрд╖ рд╕реНрдореГрддрд┐ рдореЗрдВ рдХреЛрдИ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╛рди рдбреЗрдЯрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред


рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдкрдХрд╛ DAO рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рд╡рд╕реНрддреБрдУрдВ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИред


рдпрджрд┐ Flowables рдХреНрд╡реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рдХреНрд╡реЗрд░реА рд▓рд╛рдЧреВ рдХреА Flowables , рддреЛ рдлрд╝реНрд▓реЛрдПрдмрд▓ # diverUntilChanged рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред


 @Dao abstract class UserDao : BaseDao<User>() { /** * Get a user by id. * @return the user from the table with a specific id. */ @Query(тАЬSELECT * FROM Users WHERE userid = :idтАЭ) protected abstract fun getUserById(id: String): Flowable<User> fun getDistinctUserById(id: String): Flowable<User> = getUserById(id) .distinctUntilChanged() } 

рдпрджрд┐ рдЖрдкрдХреА рдХреНрд╡реЗрд░реА LiveData , рддреЛ рдЖрдк LiveData рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╕реНрд░реЛрдд рд╕реЗ рдХреЗрд╡рд▓ рд╡рд╛рдВрдЫрд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ред


 fun <T> LiveData<T>.getDistinct(): LiveData<T> { val distinctLiveData = MediatorLiveData<T>() distinctLiveData.addSource(this, object : Observer<T> { private var initialized = false private var lastObj: T? = null override fun onChanged(obj: T?) { if (!initialized) { initialized = true lastObj = obj distinctLiveData.postValue(lastObj) } else if ((obj == null && lastObj != null) || obj != lastObj) { lastObj = obj distinctLiveData.postValue(lastObj) } } }) return distinctLiveData } 

рдЖрдкрдХреЗ LiveData рдореЗрдВ, LiveData рдХреЛ рд▓реМрдЯрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдзрд┐ public , рдФрд░ рд╡рд╣ рд╡рд┐рдзрд┐ рдЬреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рд╕рд╡рд╛рд▓ LiveData рд╣реИ protected ред


 @Dao abstract class UserDao : BaseDao<User>() { @Query(тАЬSELECT * FROM Users WHERE userid = :idтАЭ) protected abstract fun getUserById(id: String): LiveData<User> fun getDistinctUserById(id: String): LiveData<User> = getUserById(id).getDistinct() } 

рдпрд╣рд╛рдВ рдкреВрд░рд╛ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред


рдзреНрдпрд╛рди рджреЗрдВ: рдпрджрд┐ рдЖрдк рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪреА рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдкреЗрдЬрд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ, рдЬреЛ рд▓рд╛рдЗрд╡рдкреЗрдбрд┐рд╕реНрдЯрд▓рд┐рд╕реНрдЯрдмреНрдпреВрд╕реНрдЯрд▓ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛ ред рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЖрдкрдХреЛ рд╕реВрдЪреА рдЖрдЗрдЯрдо рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдФрд░ рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧреАред


рдпрд╣ рднреА рджреЗрдЦреЗрдВ: рдХрдХреНрд╖ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 7 рдХрджрдо рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЛ рдХрдорд░реЗ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрд╡рд╛рднреНрдпрд╛рд╕

Source: https://habr.com/ru/post/hi442786/


All Articles