【问题标题】:SQLite DB create fails on Android devices, /data/data/<package> does not have rw permissionSQLite DB 在 Android 设备上创建失败,/data/data/<package> 没有 rw 权限
【发布时间】:2013-02-02 17:27:44
【问题描述】:

当大约 1% 的新用户尝试启动我们的应用时,我们的数据库创建失败。主要发生在中国,有时在俄罗斯和其他地区。无法在我的任何设备上重现它,但我从日志上传中收集了信息。

我注意到一件事:当 db create 失败时,我们的包目录 /data/data/com.lootworks.swords 的文件权限为 --x 即无法读取/写入。这与我的具有 rwx 访问权限的测试设备不同。

db create 失败的原因是包目录上的 --x 吗?这对我来说确实听起来很糟糕,除非当 SQLite 尝试访问它时操作系统会做一些时髦的事情,比如更改权限。有人见过这个吗?

更多信息:

  • 该应用使用子类 SQLiteOpenHelper,非常常规(不复制准备好的 db 文件或类似的东西)
  • 对 getWritableDatabase() 的初始调用发生在 Application.onCreate() 期间
  • 该调用在调用我们的 SQLiteOpenHelper.onCreate() 方法之前失败

第一次调用 getWritableDatabase() 时出现异常。这应该回调我们的 onCreate 但在此之前它失败了:

Caused by: android.database.sqlite.SQLiteException: unable to open database file
at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1880)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:851)
at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:885)
at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:878)
at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:599)
at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:234)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:149)
at com.lootworks.swords.db.SwSqlDbOpenHelper.getDb(SourceFile:379)
at com.lootworks.swords.db.SwSqlDbOpenHelper.getOpenHelper(SourceFile:88)
at com.lootworks.swords.db.SwSqlDb.prepareDatabase(SourceFile:66)
at com.lootworks.swords.SwApplication.onCreate(SourceFile:291)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1004)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3372)
at android.app.ActivityThread.access$2200(ActivityThread.java:155)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1031)
at android.os.Handler.dispatchMessage(Handler.java:130)
at android.os.Looper.loop(SourceFile:351)
at android.app.ActivityThread.main(ActivityThread.java:3818)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:538)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:659)
at dalvik.system.NativeStart.main(Native Method)

我已经检查过的事情:

  • 有些用户是侧载的(一些 CN 文件共享的东西?)但有安装程序是 com.android.vending (GPlay) 的示例

【问题讨论】:

    标签: android sqlite


    【解决方案1】:

    是包目录上的--x导致db create失败的原因吗?

    这是我的猜测。您的进程甚至无法查看databases/ 是否存在,更不用说创建它了。

    一些用户被侧载(一些 CN 文件共享的东西?)但有安装程序是 com.android.vending (GPlay) 的示例

    请记住,Play 商店被盗版了很多,所以仅仅因为声称由 Google Play 安装的应用程序并不意味着该设备与 Play 商店兼容。

    【讨论】:

    • 我没有想到 Play 商店会被盗版,但事后看来当然会。所以我怀疑这些是来自一些非官方发行版的混乱安装。我添加了更多信息集合,以便更好地了解存在替代 android 版本/盗版的地区的成功/失败百分比。
    • 每次启动包方向权限为 rwx 的成功都有 24 小时的数据。我认为盗版的 gplay 信息是我需要的答案,谢谢
    猜你喜欢
    • 1970-01-01
    • 2011-07-23
    • 2017-09-07
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 2011-06-17
    • 2020-07-01
    • 1970-01-01
    相关资源
    最近更新 更多