Используйте предварительно созданную базу данных SQLite для проекта Android в kotlin - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь использовать уже существующую базу данных sqLite в моем приложении для Android. Я проверил, что он загружен в проект в папке активов, и я могу просматривать его в браузере БД, когда открываю его прямо из проекта.

Это схема для таблицы, которую я пытаюсь запросить

CREATE TABLE "ACTIVITY_LIST_TBL" ( 
`_ID` INTEGER NOT NULL, 
`ACT_NAME` VARCHAR NOT NULL, 
`ACT_CODE` VARCHAR, 
`IS_ACTIVE` INTEGER DEFAULT -1, 
PRIMARY KEY(`_ID`) )

Ниже приведено действие, которое создает помощника sqlite, а затем по нажатию кнопки я выполняю запрос к ACTIVITY_LIST_TBL. При выполнении запроса выдается это исключение:

android.database.sqlite.SQLiteException: нет такой таблицы: ACTIVITY_LIST_TBL (код 1 SQLITE_ERROR): при компиляции: SELECT * FROM ACTIVITY_LIST_TBL

class CalendarActivity : AppCompatActivity() {

private var cursor:Cursor? = null

override fun onCreate(savedInstanceState:Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.calendar_activity)

    findViewById<Button>(R.id.CalTestButton).setOnClickListener {

        val myDbHelper = DatabaseHelper(this)

        try { myDbHelper.createDataBase() }
        catch (ioE: IOException) { throw Error("Unable to create database") }

        try { myDbHelper.openDataBase() }
        catch (sqlE: SQLException) { throw sqlE }

        Toast.makeText(this, "Successfully Imported", Toast.LENGTH_SHORT).show()

        cursor = myDbHelper.query("ACTIVITY_LIST_TBL", null, null, null, null, null, null)

        cursor?.let {
            if (cursor!!.moveToFirst()) {
                do {
                    Toast.makeText(this,
                            "ACTIVITY_ID: " + cursor!!.getString(0) + "\n" +
                                    "ACTIVITY_NAME: " + cursor!!.getString(1) + "\n" +
                                    "ACTIVITY_CODE: " + cursor!!.getString(2) + "\n" +
                                    "IS_ACTIVE:  " + cursor!!.getString(3),
                            Toast.LENGTH_LONG).show()
                } while (cursor!!.moveToNext())
            }
        }
}

Это мой помощник по БД (текущий запрос, который я выполняю, можно найти внизу этого файла - я намеренно жестко закодировал имя таблицы для отладки):

class DatabaseHelper(private val myContext: Context) : SQLiteOpenHelper(myContext, DB_NAME, null, DB_VERSION) {

private var DB_PATH: String? = null
private var calendarDatabase: SQLiteDatabase? = null


companion object {
    private val DB_NAME = "calendarDb"
    private val DB_VERSION = 1

}


init {
    this.DB_PATH = "/data/data/" + myContext.packageName + "/" + "databases/"
    Timber.e("Path 1: $DB_PATH")
}


@Throws(IOException::class)
fun createDataBase() {
    val dbExist = checkDataBase()
    if (dbExist) {
    } else {
        this.readableDatabase
        try {
            copyDataBase()
        } catch (e: IOException) {
            throw Error("Error copying database")
        }

    }
}

private fun checkDataBase(): Boolean {
    var checkDB: SQLiteDatabase? = null
    try {
        val myPath = DB_PATH!! + DB_NAME
        checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY)
    } catch (e: SQLiteException) {
    }

    checkDB?.close()
    return if (checkDB != null) true else false
}

@Throws(IOException::class)
private fun copyDataBase() {
    val myInput = myContext.assets.open(DB_NAME)
    val outFileName = DB_PATH!! + DB_NAME
    val myOutput = FileOutputStream(outFileName)
    val buffer = ByteArray(10)

    var length: Int = myInput.read(buffer)

    while (length  > 0) {
        myOutput.write(buffer, 0, length)
        length = myInput.read(buffer)
    }
    myOutput.flush()
    myOutput.close()
    myInput.close()

}

@Throws(SQLException::class)
fun openDataBase() {
    val myPath = DB_PATH!! + DB_NAME
    calendarDatabase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY)

}

@Synchronized
override fun close() {
    if (calendarDatabase != null)
        calendarDatabase!!.close()
    super.close()
}


override fun onCreate(db: SQLiteDatabase) {}

override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
    if (newVersion > oldVersion)
        try {
            copyDataBase()
        } catch (e: IOException) {
            e.printStackTrace()

        }

}

fun query(table: String, columns: Array<String>?, selection: String?, selectionArgs: Array<String>?, groupBy: String?, having: String?, orderBy: String?): Cursor {

    return calendarDatabase!!.query("ACTIVITY_LIST_TBL", null, null, null, null, null, null)
}

}

Похоже, что я каким-то образом загружаю базу данных неправильно, любая помощь очень ценится.

Обратите внимание, что я уже настроил базу данных для совместимости с Android, выполнив следующие строки в браузере БД:

CREATE TABLE "android_metadata" ("locale" TEXT DEFAULT 'en_US')

INSERT INTO "android_metadata" VALUES ('en_US')

Я не думаю, что это имеет значение (я уже проверял это), но я решил не делать первичный ключ каждой таблицы '_id'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...