Невозможно открыть базу данных SQLite из одноэлементного объекта - PullRequest
1 голос
/ 09 ноября 2019

Я могу открыть базу данных из основного действия приложения, используя следующий код, но после того, как она обернута в одноэлементный объект, она продолжает выдавать ошибку нулевого объекта:

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
    }

}

I 'м, если предположить, что основная AppCompatActivity должна каким-то образом передавать свой контекст объекту, но мне не удалось найти работающую модель.


для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

1 Ответ

1 голос
/ 09 ноября 2019

Я считаю, что будет работать следующее:

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)
...