首页 > 解决方案 > 如何创建一个通用的 Repository 类?(安卓)

问题描述

在我的 Android 应用程序中,我使用带有存储库
的 MVVM 模型我的大多数 DAO 和存储库类几乎相同,所以我想我可以通过创建稍后扩展的通用等效项来重用一些代码

这对我的 DAO 类很有效:

@Dao
interface BaseDao<T> {
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insert(vararg entity: T)
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insertList(entities: List<T>)
    @Update
    suspend fun update(entity: T)
    @Delete
    suspend fun delete(entity: T)
}
@Dao
interface SettingDao : BaseDao<Setting> {
    @Query("SELECT value FROM settings WHERE id = :settingName")
    fun get(settingName: String): LiveData<String>
    @Query("SELECT * FROM settings ORDER BY id ASC")
    fun getAll(): LiveData<List<Setting>>
    @Query("DELETE FROM settings")
    suspend fun deleteAll()
}

现在我想为存储库做类似的事情,但我无法弄清楚
这是我尝试过的(我得到错误java.lang.ClassCastException: java.lang.Object[] cannot be cast to: Setting[]BaseRepository$insert$2.invokeSuspend

abstract class BaseRepository<T>(private val baseDao: BaseDao<T>) {
    suspend fun update(entity: T) {
        withContext(Dispatchers.IO) { baseDao.update(entity) }
    }
    suspend fun insert(entity: T) {
        withContext(Dispatchers.IO) { baseDao.insert(entity) }
    }
    suspend fun delete(entity: T) {
        withContext(Dispatchers.IO) { baseDao.delete(entity) }
    }
}
class SettingRepository(private val settingDao: SettingDao) : BaseRepository<Setting>(settingDao) {

    val company = settingDao.get("company")
    val ip = settingDao.get("ip")

    suspend fun deleteAll() {
        withContext(Dispatchers.IO) { settingDao.deleteAll() }
    }
}

我的直觉是我必须调整这一点private val baseDao: BaseDao<T>BaseRepository但我不知道如何

第二个问题 - 有没有办法在 DAO 中获取通用表名,所以我可以把

    @Query("DELETE FROM settings")
    suspend fun deleteAll()

在通用接口中也是如此(在这种情况下替换settings为实体的tableName

标签: androidkotlinrepositorydao

解决方案


推荐阅读