Как создать универсальный класс репозитория c? (Android) - PullRequest
1 голос
/ 05 февраля 2020

в моем приложении 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

объекта
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...