Получение контекста приложения для функции getInstance класса базы данных (Android kotlin)

#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.

До сих пор,

  1. Я попытался создать класс приложения, который расширяет приложение, и попытался получить оттуда контекст приложения, как предложено в другом решении stackoverflow
  2. Создан экземпляр базы данных со следующим кодом и сбой:

    частная база данных val: AuthDB = AuthDB.getInstance(контекст = getContext())

  3. Создан экземпляр базы данных со следующим кодом и сбой:

    частная база данных 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. добро пожаловать, можете ли вы дать ответ (этот ответ полезен), пожалуйста