1、创建一个类继承ViewModel
class FavDishViewModel(private val repository: FavDishRepository) : ViewModel() {
}
2、在类FavDishViewModel中添加向数据库中保存数据的方法
/**
* Launching a new coroutine to insert the data in a non-blocking way
*/
fun insert(dish: FavDish) = viewModelScope.launch {
repository.insertFavDishData(dish)
}
3、创建类viewModuleFactory,创建该类后,生命周期将接管代码
class FavDishViewModelFactory(private val repository: FavDishRepository) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(FavDishRepository::class.java)) {
@Suppress("UNCHECKED_CAST")
return FavDishViewModel(repository) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
}
4、在FavDishDatabase中添加查找dao的方法
abstract fun favDishDao() : FavDishDao
5、FavDishDao中添加查询的方法
@Query( "SELECT * FROM FAV_DISHES_TABLE ORDER BY ID")
fun getAllDishesList() : Flow<List<FavDish>>
6、在application中初始化dao和repository
private val database by lazy { FavDishRoomDatabase.getDatabase(this@FavDishApplication) }
val repository by lazy { FavDishRepository(database.favDishDao()) }
7、在界面activitie或fragment中创建viewModule对象
private val mFavDishViewModel : FavDishViewModel by viewModels{
FavDishViewModelFactory((application as FavDishApplication).repository)
}
注:
官方文档:
Android Room with a View - Kotlin | Android Developers
代码:
viewModule:
package com.example.mykotlin1.viewmodel
import androidx.lifecycle.*
import com.example.mykotlin1.model.database.FavDishRepository
import com.example.mykotlin1.model.entities.FavDish
import kotlinx.coroutines.launch
class FavDishViewModel(private val repository: FavDishRepository) : ViewModel() {
// Using LiveData and caching what allWords returns has several benefits:
// - We can put an observer on the data (instead of polling for changes) and only update the
// the UI when the data actually changes.
// - Repository is completely separated from the UI through the ViewModel.
val allDishesList : LiveData<List<FavDish>> = repository.allDishesList.asLiveData()
/**
* Launching a new coroutine to insert the data in a non-blocking way
*/
fun insert(dish: FavDish) = viewModelScope.launch {
repository.insertFavDishData(dish)
}
}
class FavDishViewModelFactory(private val repository: FavDishRepository) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(FavDishRepository::class.java)) {
@Suppress("UNCHECKED_CAST")
return FavDishViewModel(repository) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
}
database:
package com.example.mykotlin1.model.database
import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import com.example.mykotlin1.model.entities.FavDish
@Database(entities = [FavDish::class],version = 1)
abstract class FavDishRoomDatabase : RoomDatabase() {
abstract fun favDishDao() : FavDishDao
companion object{
@Volatile
private var INSTANCE : FavDishRoomDatabase ?= null
fun getDatabase(context: Context): FavDishRoomDatabase {
// if the INSTANCE is not null, then return it,
// if it is, then create the database
return INSTANCE ?: synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
FavDishRoomDatabase::class.java,
"fav_dish_database"
).build()
INSTANCE = instance
// return instance
instance
}
}
}
}
FavDishDao:
package com.example.mykotlin1.model.database
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.Query
import com.example.mykotlin1.model.entities.FavDish
import kotlinx.coroutines.flow.Flow
@Dao
interface FavDishDao {
@Insert
suspend fun insertFavDishDetails(favDish : FavDish)
@Query( "SELECT * FROM FAV_DISHES_TABLE ORDER BY ID")
fun getAllDishesList() : Flow<List<FavDish>>
@Query("DELETE FROM FAV_DISHES_TABLE")
suspend fun deleteAll()
}
FavDishApplication:
package com.example.mykotlin1.application
import android.app.Application
import com.example.mykotlin1.model.database.FavDishRepository
import com.example.mykotlin1.model.database.FavDishRoomDatabase
class FavDishApplication : Application(){
private val database by lazy { FavDishRoomDatabase.getDatabase(this@FavDishApplication) }
val repository by lazy { FavDishRepository(database.favDishDao()) }
}