在Android设备上SQLite DB创建失败,/ data / data / <package>没有rw权限</package>

时间:2013-02-02 17:27:44

标签: android sqlite

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

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

包目录上的--x是db创建失败的原因吗?这对我来说确实听起来不好,除非操作系统在SQLite尝试访问它时做了像更改权限这样的时髦。有没有人见过这个?

更多信息:

  • 该应用程序使用子类化SQLiteOpenHelper,非常例行程序(不复制准备好的db文件或类似的东西)
  • 在Application.onCreate()
  • 期间发生对getWritableDatabase()的初始调用
  • 该调用在调用我们的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)的例子

1 个答案:

答案 0 :(得分:1)

  

包目录上的--x是否为db创建失败的原因?

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

  

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

请记住,Play商店的盗版程度相当高,因为该应用声称由Google Play安装,并不意味着该设备与Play商店兼容。