首页 > 解决方案 > 在一些 Android 设备上升级数据库时抛出 SQLiteException 而没有消息

问题描述

在生产中升级数据库时在一些设备上抛出了一个SQLiteException问题,但不幸的是我无法重现(大约 10% 的活动设备受到影响):

升级前的表格:

CREATE TABLE "UPDATE_CHECK_ENTITY" (_id INTEGER PRIMARY KEY,LICENSE_TOKEN TEXT,RELEASE_NOTE TEXT,VERSION TEXT,URL_TO_APK TEXT,URL_TO_RELEASE_NOTE TEXT);

INSERT INTO UPDATE_CHECK_ENTITY(LICENSE_TOKEN,URL_TO_APK,URL_TO_RELEASE_NOTE,_id,RELEASE_NOTE,VERSION) VALUES (?,?,?,?,?,?);

升级脚本以添加APK_SHA256到表方案中:

ALTER TABLE "UPDATE_CHECK_ENTITY" RENAME TO "UPDATE_CHECK_ENTITY_OLD";

CREATE TABLE "UPDATE_CHECK_ENTITY" (_id INTEGER PRIMARY KEY,LICENSE_TOKEN TEXT,RELEASE_NOTE TEXT,VERSION TEXT,URL_TO_APK TEXT,APK_SHA256 TEXT,URL_TO_RELEASE_NOTE TEXT);

INSERT INTO "UPDATE_CHECK_ENTITY" ("_id","LICENSE_TOKEN","RELEASE_NOTE","VERSION","URL_TO_APK","URL_TO_RELEASE_NOTE") SELECT "UPDATE_CHECK_ENTITY_OLD"."_id","UPDATE_CHECK_ENTITY_OLD"."LICENSE_TOKEN","UPDATE_CHECK_ENTITY_OLD"."RELEASE_NOTE","UPDATE_CHECK_ENTITY_OLD"."VERSION","UPDATE_CHECK_ENTITY_OLD"."URL_TO_APK","UPDATE_CHECK_ENTITY_OLD"."URL_TO_RELEASE_NOTE" FROM "UPDATE_CHECK_ENTITY_OLD";

DROP TABLE "UPDATE_CHECK_ENTITY_OLD";

以下异常发生在一些设备上,但对我来说无法重现:

java.lang.RuntimeException: 
  at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3654)
  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3806)
  at android.app.servertransaction.LaunchActivityItem.execute (LaunchActivityItem.java:83)
  at android.app.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor.java:135)
  at android.app.servertransaction.TransactionExecutor.execute (TransactionExecutor.java:95)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2267)
  at android.os.Handler.dispatchMessage (Handler.java:107)
  at android.os.Looper.loop (Looper.java:237)
  at android.app.ActivityThread.main (ActivityThread.java:8167)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:496)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1100)
Caused by: android.database.sqlite.SQLiteException: 
  at android.database.sqlite.SQLiteConnection.nativePrepareStatement (Native Method)
  at android.database.sqlite.SQLiteConnection.acquirePreparedStatement (SQLiteConnection.java:1372)
  at android.database.sqlite.SQLiteConnection.prepare (SQLiteConnection.java:811)
  at android.database.sqlite.SQLiteSession.prepare (SQLiteSession.java:590)
  at android.database.sqlite.SQLiteProgram.<init> (SQLiteProgram.java:62)
  at android.database.sqlite.SQLiteStatement.<init> (SQLiteStatement.java:33)
  at android.database.sqlite.SQLiteDatabase.executeSql (SQLiteDatabase.java:2329)
  at android.database.sqlite.SQLiteDatabase.execSQL (SQLiteDatabase.java:2257)
  at org.cryptomator.data.db.Sql$SqlInsertSelectBuilder.executeOn (Sql.java:293)

创建新UPDATE_CHECK_ENTITY表有效,执行时抛出异常INSERTUPDATE_CHECK_ENTITY_OLD以前不存在。

一些用户报告说重新安装该应用程序可以解决问题,但是随后还会执行此数据库升级,所以我没有理由认为问题可能是:/。

如果有帮助,这里是它崩溃的源代码部分,但可能太多了,无法首先深入研究 https://github.com/cryptomator/android/blob/ff2596689f134cf769f9253276a5955eae355b3d/data/src/main/java/org/cryptomator/数据/db/Upgrade6To7.kt#L33-L37

标签: javaandroidsqlite

解决方案


推荐阅读