android - 如何创建一个通用的 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
解决方案
推荐阅读
- python - 将烧瓶应用程序推送到 heroku 时未找到包错误
- jquery - 无法在单击时动态更改按钮上的 div 内容
- git - 如何完全重新设置主分支中的所有提交?
- node.js - 跨多个文件具有相同名称的非导出变量导致 TS2403
- php - Symfony / Doctrine 中的映射异常:在“App\DocumentBundle\Entity\Document#file”中找不到目标实体 App\DocumentBundle\File
- pyspark - 创建 pyspark 数据框时如何将小数作为值传递?
- html - 如何在引导程序中制作下拉列表?
- java - 如果我在方法中初始化模型,为什么我不能访问它?
- bash - 如何解析 csv 文件以在第 2 列的文件中查找“失败”并找到第 7 列的平均值
- linux - Bash 脚本 - 如何检查是否安装了软件包并根据终端结果执行操作