提问者:小点点

我可以把方法放在哪里来检查lateinit变量?


我正在使用静态编程语言在Android Studio中制作一个应用程序。ListFragment中的lateinit变量向我抛出一个错误,名为:

kotlin. un和初始化属性访问异常:lateinit属性dbhelper尚未初始化。

我知道有一个表单可以使用方法(isFirst)检查lateinit。

类carsDBHelper:

class CochesDBHelper (context: Context) : SQLiteOpenHelper(context, DATABASE_NAME, null,             DATABASE_VERSION) {
    val cars = ArrayList<Cars>()
    companion object {
        // If you change the database schema, you must increment the database version.
        const val DATABASE_VERSION = 1
        const val DATABASE_NAME = "cars.db"
    }   

ListFragment,我们称之为CarsDBHelper的类:

companion object{
    lateinit var dbHelper: CarsDBHelper
 }

val list= dbHelper.getAllCars()

val recyclerView: RecyclerView = v.findViewById(R.id.recyclerView);
recyclerView.layoutManager = LinearLayoutManager(context)

val adapter: RecyclerViewAdapter = RecyclerViewAdapter(list, 
context);
recyclerView.adapter = adapter

我试图在CarsDBhelper和ListFragment类中创建一个方法,但抛给我另一个错误。

fun addElement(element: String) {
    if (!::cars.isInitialized) {
      cars= MutableList<String>();
    }

    cars.add(element);
}

我试图在变量下检查,就像我在另一篇文章中看到的那样,但没有成功。

lateinit var dbHelper: CochesDBHelper;
if (::dbHelper.isInitialized) { //in this line throws this error: Expecting member declaration

}

共2个答案

匿名用户

您的数据库应该是单例的,因此lateinit模式不适合这种情况。您应该将数据库助手更改为具有私有构造函数,然后在其自己的配套对象中将其创建为单例。

class CochesDBHelper private constructor(
    context: Context
) : SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) {
    
    companion object {
        const val DATABASE_VERSION = 1
        const val DATABASE_NAME = "cars.db"

        @Volatile 
        private var INSTANCE: CochesDBHelper? = null

        fun getInstance(context: Context): CochesDBHelper {
            return INSTANCE ?: synchronized(this) {
                INSTANCE ?: CochesDBHelper(context).also { INSTANCE = it }
            }
        }
    }   

    //...
}

然后,每当您需要访问它时,您将使用上下文调用CochesDBHelper. getInstance()

// In fragment:

val dbHelper = CochesDBHelper.getInstance(requireContext())

val list = dbHelper.getAllCars()
//...

匿名用户

您应该在片段中定义lateinit适配器变量,如下所示:

适配器=CochesDBHelper()

相关问题