an die parent Activity gebundenes ViewModel 2. Fragments können über das ViewModel auf LiveData-Referenz zugreifen 3. Änderungen an LiveData durch .setValue() oder .postValue() werden an Subscriber propagiert val sharedViewModel = activity?.run { ViewModelProviders.of(this).get(MenuViewModel::class.java) }
abstract und von „RoomDatabase“ abgeleitet sein • Enthält Liste der verwalteten Entities • Muss abstract Method enthalten, die DAO zurück liefert (wird von Room generiert) @Database( entities = [LunchItemDbEntity::class], version = 2, exportSchema = false ) @TypeConverters(DateTypeConverter::class) abstract class LunchDatabase : RoomDatabase() { abstract fun lunchItemDao(): LunchItemDao companion object { fun getInstance(context: Context): LunchDatabase = Room.databaseBuilder(context, LunchDatabase::class.java, "lunchdb") .build() } }
var id: Long = 0, var description: String, var offerDate: Date, var price: Float) : Serializable • Über @Entity-Annontation Parameter kann Entities-DB Repräsentation gesteuert werden • Indizes • TableNames • ForeignKeys
fun insert(note: LunchItemDbEntity) @Insert(onConflict = OnConflictStrategy.REPLACE) fun insertAll(note: List<LunchItemDbEntity>) @Query("SELECT id FROM LunchItemDbEntity WHERE offerDate >= :date ORDER BY offerDate LIMIT 1") fun getLunchIdOfDate(date: Long): Int } • Default Annotations für Insert, Delete, … • Queries können LiveData returnen • RxJava support (via extension)
... @Query("SELECT * FROM LunchItemDbEntity ORDER BY offerDate ASC ") fun allLunchItems(): DataSource.Factory<Int, LunchItemDbEntity> // ... } • PagedList ist „Snapshot“-Sicht auf Daten • Items einer PagedList sind immutable • Bei Aktualisierung der Daten wird neues Datasource/PagedList Paar erzeugt, das alte invalidiert • Datasource.Factory erzeugt Datasources Query zur Erzeugung einer Datasource.Factory
Long ) : PagedList.BoundaryCallback<LunchItemEntity>(), KoinComponent, Parcelable { … override fun onZeroItemsLoaded() { super.onZeroItemsLoaded() // LOAD DATA FROM WEB AND PERSIST IN ROOM } override fun onItemAtEndLoaded(itemAtEnd: LunchItemEntity) { super.onItemAtEndLoaded(itemAtEnd) …. } override fun onItemAtFrontLoaded(itemAtFront: LunchItemEntity) { super.onItemAtFrontLoaded(itemAtFront) …. } … } Gebräuchlicher Anwendungsfall: Mehrstufige Datenzugriff über Netzwerk und Datenbank
im Umlauf • PageKeyedDatasource • Für APIs mit doppelt verketteten Pages • ItemKeyedDataSource • Der Key der nächsten Page kann aus dem letzten bekannten Item abgeleitet werden • PositionalDataSource • Unterstützt APIs mit Offset-basiertem Paging