CV工程师
2024-09-27 12:08:21 阅读:1177
在使用 Room 和 ViewModel 进行数据存储时,你可以按照以下步骤来初始化和管理你的 setting 表中的 key-value 数据。
首先,你需要定义一个数据实体类 Setting,这将对应你的 setting 表。
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "setting")
data class Setting(
    @PrimaryKey(autoGenerate = true) val id: Long = 0,
    val key: String,
    val value: String
)
接下来,创建一个 DAO(数据访问对象)来定义你的数据库操作。
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.Query
import androidx.room.Update
import androidx.room.Delete
@Dao
interface SettingDao {
    @Insert
    suspend fun insert(setting: Setting)
    @Query("SELECT * FROM setting WHERE key = :key LIMIT 1")
    suspend fun getSettingByKey(key: String): Setting?
    @Update
    suspend fun update(setting: Setting)
    @Delete
    suspend fun delete(setting: Setting)
    @Query("SELECT * FROM setting")
    suspend fun getAllSettings(): List<Setting>
}
然后,创建一个数据库类来访问 SettingDao。
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import android.content.Context
@Database(entities = [Setting::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun settingDao(): SettingDao
    companion object {
        @Volatile
        private var INSTANCE: AppDatabase? = null
        fun getDatabase(context: Context): AppDatabase {
            return INSTANCE ?: synchronized(this) {
                val instance = Room.databaseBuilder(
                    context.applicationContext,
                    AppDatabase::class.java,
                    "app_database"
                ).build()
                INSTANCE = instance
                instance
            }
        }
    }
}
现在,创建 ViewModel 来处理你对数据的操作。
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.launch
class SettingViewModel(private val repository: SettingRepository) : ViewModel() {
    private val _settings = MutableLiveData<List<Setting>>()
    val settings: LiveData<List<Setting>> get() = _settings
    fun getSetting(key: String) {
        viewModelScope.launch {
            val setting = repository.getSettingByKey(key)
            setting?.let {
                // 处理查询到的设置
            }
        }
    }
    fun insert(setting: Setting) {
        viewModelScope.launch {
            repository.insert(setting)
            loadAllSettings() // 插入后更新列表
        }
    }
    fun loadAllSettings() {
        viewModelScope.launch {
            _settings.value = repository.getAllSettings()
        }
    }
    // 其他增、删、改的方法
}
创建一个 Repository 来封装对 DAO 的访问。
class SettingRepository(private val settingDao: SettingDao) {
    suspend fun insert(setting: Setting) {
        settingDao.insert(setting)
    }
    suspend fun getSettingByKey(key: String): Setting? {
        return settingDao.getSettingByKey(key)
    }
    suspend fun getAllSettings(): List<Setting> {
        return settingDao.getAllSettings()
    }
    // 其他增、删、改的方法
}
在你的 Activity 或 Fragment 中初始化 ViewModel。
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
class MainActivity : AppCompatActivity() {
    private val settingViewModel: SettingViewModel by viewModels {
        SettingViewModelFactory(SettingRepository(AppDatabase.getDatabase(this).settingDao()))
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        // 使用 ViewModel
        settingViewModel.loadAllSettings()
    }
}
通过以上步骤,你可以实现使用 Room 和 ViewModel 进行 key-value 数据的增查删改。在 ViewModel 中通过 viewModelScope 来执行数据库操作,这样可以确保操作在后台线程中进行,避免阻塞主线程。
评论
扫描二维码获取文章详情
更多精彩内容尽在:WWW.ZNGG.NET
