无法从单例对象打开 SQLite 数据库
Unable to open SQLite database from singleton object
我可以使用以下代码从主应用程序 activity 中打开数据库,但是一旦将其包装到单例对象中,它就会不断抛出空对象错误:
object CommonClass {
fun openSQLDatabase(): SQLiteDatabase? {
var dbase: SQLiteDatabase? = null
try {
dbase = openOrCreateDatabase(
"dbfile.sqlite",
Context.MODE_PRIVATE, null
)
} catch (e: SQLException) {
println(e.message)
}
return dbase
}
}
我假设主 AppCompatActivity 应该以某种方式将其上下文传递给对象,但我一直无法找到工作模型。
去斯瓦扬吉特
Android Studio 突出显示 Context.MODE_PRIVATE 参数并将其标记为:
Type mismatch.
Required: SQLiteDatabase.CursorFactory?
Found: Int
但是当我将 AppCompatActivity 实现到单例对象并从主对象 Context.MODE_PRIVATE 传递 activity,它运行但抛出此错误:
java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory)' on a null object reference
我相信以下方法会奏效:
object CommonClass {
fun openSQLDatabase(context: Context): SQLiteDatabase? {
var dbase: SQLiteDatabase? = null
if (dbase == null) {
try {
dbase = openOrCreateDatabase(context.getDatabasePath("dbfile.sqlite"), null)
} catch (e: SQLException) {
println(e.message)
}
}
return dbase
}
}
请注意,这假设您希望数据库位于默认位置,即 data/data/the_package_name/databases/dbfile.sqlite
您可以 invoke/call 使用类似 :-
val mydb = CommonClass.openSQLDatabase(this)
我可以使用以下代码从主应用程序 activity 中打开数据库,但是一旦将其包装到单例对象中,它就会不断抛出空对象错误:
object CommonClass {
fun openSQLDatabase(): SQLiteDatabase? {
var dbase: SQLiteDatabase? = null
try {
dbase = openOrCreateDatabase(
"dbfile.sqlite",
Context.MODE_PRIVATE, null
)
} catch (e: SQLException) {
println(e.message)
}
return dbase
}
}
我假设主 AppCompatActivity 应该以某种方式将其上下文传递给对象,但我一直无法找到工作模型。
去斯瓦扬吉特
Android Studio 突出显示 Context.MODE_PRIVATE 参数并将其标记为:
Type mismatch.
Required: SQLiteDatabase.CursorFactory?
Found: Int
但是当我将 AppCompatActivity 实现到单例对象并从主对象 Context.MODE_PRIVATE 传递 activity,它运行但抛出此错误:
java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory)' on a null object reference
我相信以下方法会奏效:
object CommonClass {
fun openSQLDatabase(context: Context): SQLiteDatabase? {
var dbase: SQLiteDatabase? = null
if (dbase == null) {
try {
dbase = openOrCreateDatabase(context.getDatabasePath("dbfile.sqlite"), null)
} catch (e: SQLException) {
println(e.message)
}
}
return dbase
}
}
请注意,这假设您希望数据库位于默认位置,即 data/data/the_package_name/databases/dbfile.sqlite
您可以 invoke/call 使用类似 :-
val mydb = CommonClass.openSQLDatabase(this)