в моем приложении Android я использую модель MVVM с репозиториями
большинство моих классов DAO и Repositories почти идентичны, поэтому я решил, что смогу повторно использовать некоторый код, создав обобщенные c эквиваленты, которые впоследствии будут расширены
это нормально работало для моих классов 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
, но я не могу понять, как
И второй вопрос - есть ли способ получить имя таблицы generi c в DAO, чтобы я мог также поместить
@Query("DELETE FROM settings")
suspend fun deleteAll()
в интерфейс generi c (в данном случае заменить settings
на tableName
объекта