Я пытаюсь использовать уже существующую базу данных 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'