我正在使用静态编程语言在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
}
您的数据库应该是单例的,因此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()