获取数据库 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 数据库。
到目前为止,
我已经尝试创建扩展应用程序的应用程序 class 并尝试按照另一个 Whosebug 解决方案中的建议从那里获取应用程序上下文
使用以下代码实例化数据库失败:
私有验证数据库:AuthDB = AuthDB.getInstance(context = getContext())
使用以下代码实例化数据库失败:
私有验证数据库: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)
我正在按照 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 数据库。
到目前为止,
我已经尝试创建扩展应用程序的应用程序 class 并尝试按照另一个 Whosebug 解决方案中的建议从那里获取应用程序上下文
使用以下代码实例化数据库失败:
私有验证数据库:AuthDB = AuthDB.getInstance(context = getContext())
使用以下代码实例化数据库失败:
私有验证数据库: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)