#android #kotlin #repository-pattern #android-viewmodel
#Android #kotlin #репозиторий-шаблон #android-viewmodel
Вопрос:
Я пишу приложение для Android, следуя дизайну архитектурных компонентов Android.
Это класс базы данных:
@Database(entities = [Authentication::class],version = 1, exportSchema = false)
abstract class AuthDB: RoomDatabase(){
abstract val authenticationDao :AuthenticationAccessObject
companion object{
@Volatile
private var INSTANCE: AuthDB? = null
fun getInstance(context: Context): AuthDB {
synchronized(this){
var instance = INSTANCE
if(instance == null){
instance = Room.databaseBuilder(
context.applicationContext,
AuthDB::class.java,
"authentication_database"
)
.fallbackToDestructiveMigration()
.build()
INSTANCE = instance
}
return instance
}
}
}
}
Это класс репозитория:
class Repository2() {
private val database: AuthDB = AuthDB.getInstance(context = getContext())
private val daoA = database.authenticationDao
//Function to register a new user to system
fun insertAuth(userData: Any){
if (userData is Authentication){
daoA.insertAuth(userData)
} else {
throw IllegalArgumentException()
}
}
Моя цель состоит в том, что когда я пишу ViewModel, я хочу создать экземпляр Repository2 и вызвать функции, например, следующим образом:
var repo = Repository2()
repo.insertAuth(authenticationObject)
У меня возникли проблемы с предоставлением контекста для getInstance в репозитории. Контекст должен быть таким, чтобы при создании экземпляра репозитория он автоматически получал контекст приложения и создавал экземпляр базы данных AuthDB.
До сих пор,
- Я попытался создать класс приложения, который расширяет приложение, и попытался получить оттуда контекст приложения, как предложено в другом решении stackoverflow
- Создан экземпляр базы данных со следующим кодом и сбой:
частная база данных val: AuthDB = AuthDB.getInstance(контекст = getContext())
- Создан экземпляр базы данных со следующим кодом и сбой:
частная база данных val: AuthDB = AuthDB.getInstance(Application.getApplicationContext())
Я пытаюсь уже около двух дней, и ничего не работает, я считаю, что мне здесь не хватает основной концепции. Я надеюсь, что кто-нибудь может подтолкнуть меня в правильном направлении?
С уважением, Салик
Ответ №1:
попробуйте это решение
Редактировать:-
используйте этот способ для доступа к базе данных RoomDatabase
@Database(
entities = [CompaniesModel::class, CompaniesHomeModel::class, UserPoint::class, Image::class, Offer::class, Rewords::class, BranchModel::class, PointsModel::class, RedeemModel::class, MainData::class, SubData::class],
version = 15)
abstract class DataBase : RoomDatabase() {
abstract fun homeDao(): HomeDao
abstract fun menuDao(): MenuDao
abstract fun companiesDao(): CompaniesListDao
abstract fun branchesDao(): BranchesDao
companion object {
@Volatile
private var databaseInstance: DataBase? = null
fun getDatabaseInstance(mContext: Context): DataBase =
databaseInstance ?: synchronized(this) {
databaseInstance ?: buildDatabaseInstance(mContext).also {
databaseInstance = it
}
}
private fun buildDatabaseInstance(mContext: Context) =
Room.databaseBuilder(mContext, DataBase::class.java, "crm")
.fallbackToDestructiveMigration()
.allowMainThreadQueries()
.build()
}
}
а для getContext() используйте класс Application(), подобный этому:
class App : Application() {
override fun onCreate() {
super.onCreate()
instance = this
}
companion object {
lateinit var instance: App
}
}
и передайте это так
private val database: AuthDB = AuthDB.getInstance(app.instance)
Комментарии:
1. Потрясающе!! Большое спасибо!
2. добро пожаловать, можете ли вы дать ответ (этот ответ полезен), пожалуйста