无法从单例对象打开SQLite数据库

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法从单例对象打开SQLite数据库相关的知识,希望对你有一定的参考价值。

我可以使用以下代码从主应用程序活动中打开数据库,但是一旦将其包装到一个单例对象中,它就会不断抛出空对象错误:

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应该以某种方式将其上下文传递给该对象,但是我无法找到有效的模型。


to Swayangjit

android Studio突出显示Context.MODE_PRIVATE参数并将其标记为:

Type mismatch.
Required: SQLiteDatabase.CursorFactory?
Found: Int

但是当我将AppCompatActivity实现到单例对象并从主活动传递Context.MODE_PRIVATE时,它会运行,但会引发此错误:

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

您可以使用类似:-]的方法来调用/调用它

 val mydb = CommonClass.openSQLDatabase(this)

以上是关于无法从单例对象打开SQLite数据库的主要内容,如果未能解决你的问题,请参考以下文章

死磕 Spring----- IOC 之从单例缓存中获取单例 bean

从单例的双重检查锁想到的

从单例模式到并发编程volatile

无法从片段中的 SQLite 获取数据

从单例模式看Vue单例组件

从单例模式开始