少量Android设备数据库升级时抛出无信息SQLiteException求助
安卓SQLite数据库升级异常问题
生产环境中少量设备升级数据库时抛出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表可正常创建 - 异常在执行
INSERT语句时抛出 - 升级前不存在
UPDATE_CHECK_ENTITY_OLD表 - 部分用户反馈重装应用可解决问题,但重装后仍会执行该数据库升级逻辑,暂未定位问题根源
内容的提问来源于stack exchange,提问作者Jules
相关产品推荐
相关产品推荐

