获取数据库 class 的 getInstance 函数的应用程序上下文 (android kotlin)

Getting application context for getInstance function of database class (android kotlin)

我正在按照 Android 架构组件设计编写一个 android 应用程序。

这是数据库class:

@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:

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. 我已经尝试创建扩展应用程序的应用程序 class 并尝试按照另一个 Whosebug 解决方案中的建议从那里获取应用程序上下文

  2. 使用以下代码实例化数据库失败:

    私有验证数据库:AuthDB = AuthDB.getInstance(context = getContext())

  3. 使用以下代码实例化数据库失败:

    私有验证数据库:AuthDB = AuthDB.getInstance(Application.getApplicationContext())

我已经尝试了大约两天,但没有任何效果,我相信我在这里遗漏了一个主要概念。我希望有人能在正确的方向推动我?

亲切的问候, 萨利克

试试这个解决方案

编辑:-

使用这种方式访问​​您的 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:

class App : Application() {

    override fun onCreate() {
        super.onCreate()
        instance = this

    }

    companion object {
        lateinit var instance: App
    }
}

然后这样传递

private val database: AuthDB = AuthDB.getInstance(app.instance)