gpt4 book ai didi

android - E/SQLiteLog : (1) no such table: Cars on Android 9 Pie

转载 作者:行者123 更新时间:2023-12-02 07:31:36 24 4
gpt4 key购买 nike

为什么数据库的应对不适用于 Android 9?我的实现是基于这个 example (video)。在从 4.1 到 10 的 Android 版本上一切正常,但在 9 Pie 上却不行。

这是我所做的:

fun importToApp(fileNameOnSD: String) {
val sd = File(sdFolder)
if (sd.canWrite()) {
val currentDB = File(Environment.getDataDirectory(), dataTemp)
val backupDB = File(sd, fileNameOnSD)
if (currentDB.exists()) {
try {
val src = FileInputStream(backupDB).channel
val dst = FileOutputStream(currentDB).channel
dst.transferFrom(src, 0, src.size())
src.close()
dst.close()
} catch (e: FileNotFoundException) {
e.printStackTrace()
} catch (e: IOException) {
e.printStackTrace()
}
}
}
copyData()
}

private fun copyData() {
db.delete(TABLE, null, null)
val dbBackup = context.openOrCreateDatabase(DB_TEMP, Context.MODE_PRIVATE, null)
val cursor = dbBackup.query(true, TABLE, null, null, null, null, null, null, null)

cursor.moveToFirst()
while (!cursor.isAfterLast) {
db.insert(TABLE, null, modelToValues(cursorToModel(cursor)))
cursor.moveToNext()
}
cursor.close()
context.deleteDatabase(dataTemp)
utilities.toast(context.resources.getString(R.string.db_suc_imported), 0)
}

我还调用了该方法( as proposed here ):
override fun onOpen(db: SQLiteDatabase) {
super.onOpen(db)
if (Build.VERSION.SDK_INT == 28)
db.disableWriteAheadLogging()
}

这是Android Pie中引起的崩溃:
E/SQLiteLog: (1) no such table: Cars 
D/AndroidRuntime: Shutting down VM


--------- beginning of crash
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.easyapps.cryptnote, PID: 3174
android.database.sqlite.SQLiteException: no such table: Cars (code 1 SQLITE_ERROR): , while compiling: SELECT DISTINCT * FROM Cars
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:903)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:514)
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:46)
at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1408)
at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1255)
at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1126)
at com.easyapps.cryptnote.ListDatabase.copyData(CarsDatabase.kt:144)
at com.easyapps.cryptnote.ListDatabase.importToApp(CarsDatabase.kt:137)
at com.easyapps.cryptnote.ImportActivity$importDB$$inlined$apply$lambda$1.onClick(CarsActivity.kt:273)
at android.view.View.performClick(View.java:6597)
at android.view.View.performClickInternal(View.java:6574)
at android.view.View.access$3100(View.java:778)
at android.view.View$PerformClick.run(View.java:25885)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
I/Process: Sending signal. PID: 3174 SIG: 9

此行 val cursor = dbBackup.query(true, TABLE, null, null, null, null, null, null, null)使应用程序崩溃。到目前为止,我在两种不同的真实 Android 设备上进行了测试,一种使用 Android Lollipop (Moto),另一种使用 Android Pie (Samsung A40)。其他版本是虚拟的。最有趣的是它可以在带有 Android Pie 的三星上运行,但不能在带有 Android Pie 的虚拟设备上运行。尽管如此,我认为三星设备是个异常(exception),我需要在所有 Android 设备上运行,无论是真实的还是虚拟的。

最佳答案

所以,我使用第一个 answer 解决了这个问题。 .我添加了一个内部类

class TempDataBase(private val context: Context, dbName: String, version: Int) : SQLiteOpenHelper(
context,
dbName, null,
version
) {
override fun onCreate(db: SQLiteDatabase) {
db.execSQL("CREATE TABLE $TABLE ($ID INTEGER PRIMARY KEY AUTOINCREMENT, $TITLE TEXT, $NOTE TEXT, $DATE TEXT);")
}

override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
db.execSQL("DROP TABLE IF EXISTS $TABLE")
onCreate(db)
}

override fun onConfigure(db: SQLiteDatabase) {
db.disableWriteAheadLogging()
super.onConfigure(db)
}
}

并在我的 copyData() 中调用它方法:
private fun copyData() {
db.delete(TABLE, null, null)
val dbBackup = if (Build.VERSION.SDK_INT == Build.VERSION_CODES.P) {
SQLiteDatabase.openDatabase(TempDataBase(context, DB_TEMP, 1).readableDatabase.path, null, SQLiteDatabase.OPEN_READWRITE)
}
else
context.openOrCreateDatabase(DB_TEMP, Context.MODE_PRIVATE, null)
val cursor = dbBackup.query(true, TABLE,null,null,null,null,null,null, null)
cursor.moveToFirst()
while (!cursor.isAfterLast) {
db.insert(TABLE, null, modelToValues(cursorToModel(cursor)))
cursor.moveToNext()
}
cursor.close()
db.close()
context.deleteDatabase(dataTemp)
utilities.toast(context.resources.getString(R.string.db_suc_imported), 0)
}

基本上,Android P 会查找数据库并检测到该数据库不存在,而其他版本并不真正要求临时数据库必须确实存在。我的内部类创建了一个临时数据库作为缓冲区来复制 Android 9 使用的数据。

谁还在寻找解决方案,请发表评论以获取更多信息,我会尽快回复。

关于android - E/SQLiteLog : (1) no such table: Cars on Android 9 Pie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60608884/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com