Android Kotlin 类初始化

问题描述 投票:0回答:1

可以占用您一点时间吗?我已经被困了好几天来了解 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()
    }
}
android kotlin class initialization
1个回答
0
投票

简单的答案让创建

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(...)
}
© www.soinside.com 2019 - 2024. All rights reserved.