可以占用您一点时间吗?我已经被困了好几天来了解 android studio 中使用 kotlin 的类初始化。我真的非常需要对此有基本的了解。这确实是不同的。如何在 Android 中正确初始化类?为什么我不断收到错误消息“lateinit property db 尚未初始化”?一点亮点将不胜感激。谢谢你并致以诚挚的问候
问题是“private Lateinit var db: AppDatabase”尚未初始化。 实际上,在 Android 中使用 klotlin 初始化类的正确方法是什么?
class PinjamanSuperRepository(
private val api: PinjamanApi,
private val preferences: UserPreferences
) : BasePinjamanRepository(){
private lateinit var db: AppDatabase
private val pagingSourceFactory = { db.pinjamanAktifDao.select_all() }
@ExperimentalPagingApi
fun getPinjamanAktif(): Flow<PagingData<Data>> {
return Pager(
config = PagingConfig(
pageSize = NETWORK_PAGE_SIZE,
enablePlaceholders = false
),
remoteMediator = PlayersRemoteMediator(
api,
db
),
pagingSourceFactory = pagingSourceFactory
).flow
}
companion object {
private const val NETWORK_PAGE_SIZE = 25
}
}
这是AppDatabase类
abstract class AppDatabase : RoomDatabase() {
abstract val pinjamanAktifDao: PinjamanAktifDao
abstract val remoteKeysDao: RemoteKeysDao
companion object {
@Volatile
private var instance: AppDatabase? = null
private val LOCK = Any()
operator fun invoke(context: Context) = instance
?: synchronized(LOCK) {
instance ?: buildDatabase(
context
).also {
instance = it
}
}
private fun buildDatabase(context: Context) =
Room.databaseBuilder(
context.applicationContext,
AppDatabase::class.java,
"app_db"
).fallbackToDestructiveMigration()
.build()
}
}
简单的答案让创建
PinjamanSuperRepository
的人进入数据库。
class PinjamanSuperRepository(
private val api: PinjamanApi,
private val preferences: UserPreferences,
private val db: AppDatabase
) : BasePinjamanRepository()
//in viewmodel or whatever has access to a context.
val db = AppDatabase(getApplicationContext()) //however you get the AppDatabase.Companion.instance
val repo = PinjamanSuperRepository(api,preferences,db)
您面临的问题是您将 RoomDatabse 用作单例,这很好,但是访问它需要用户提供
Context
,无论它是否已经创建。 PinjamanSuperRepository
无权访问Context
,因此它永远无法自行创建/检索数据库。
快速但糟糕的选择
fun getPinjamanAktif(context: Context): Flow<PagingData<Data>>{
db = AppDatabase(context)
return Pager(...)
}