java - 在一些 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
表有效,执行时抛出异常INSERT
。UPDATE_CHECK_ENTITY_OLD
以前不存在。
一些用户报告说重新安装该应用程序可以解决问题,但是随后还会执行此数据库升级,所以我没有理由认为问题可能是:/。
如果有帮助,这里是它崩溃的源代码部分,但可能太多了,无法首先深入研究 https://github.com/cryptomator/android/blob/ff2596689f134cf769f9253276a5955eae355b3d/data/src/main/java/org/cryptomator/数据/db/Upgrade6To7.kt#L33-L37
解决方案
推荐阅读
- python - 即使我将学习率设置得尽可能小,张量流优化器也会输出 nan
- ios - 在 Swift 中从滚动视图创建图像和文本多页 pdf 文件
- javascript - 从字符串中获取特定的东西
- rxjs - 如何在 rxjs 中将操作数据传递到可管道操作符流下游?
- python - ImportError:没有名为 textblob 的模块
- beautifulsoup - 如何使用 BeautifulSoup 的值获取单个选项的文本
- c# - UWP 中是否有表示两个“int”的类型?
- accessibility - 可访问性 - 带有工具提示的无线电选择的焦点顺序
- docker - Docker:容器启动时如何运行apache服务?
- javascript - 是否可以在打字稿的可索引类型接口中定义函数?