SQLiteDiskIOException:磁盘I/O错误(代码1802):,而在编译时:PRAGMA journal_mode [英] SQLiteDiskIOException: disk I/O error (code 1802): , while compiling: PRAGMA journal_mode

查看:132
本文介绍了SQLiteDiskIOException:磁盘I/O错误(代码1802):,而在编译时:PRAGMA journal_mode的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我最近发生了几次崩溃,但是最近发生的崩溃越来越多,我无法弄清楚如何重现或修复它们.这是最常出现的一个

I've been having a few crashes that have been coming up more often recently and i cannot figure out how to reproduce them or fix them. Here is the one that comes up most often

Fatal Exception: java.lang.RuntimeException: Unable to create application com.myapp.MyApplication: android.database.sqlite.SQLiteDiskIOException: disk I/O error (code 1802): , while compiling: PRAGMA journal_mode
   at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5436)
   at android.app.ActivityThread.-wrap2(ActivityThread.java)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1546)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:154)
   at android.app.ActivityThread.main(ActivityThread.java:6154)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)
Caused by android.database.sqlite.SQLiteDiskIOException: disk I/O error (code 1802): , while compiling: PRAGMA journal_mode
   at android.database.sqlite.SQLiteConnection.nativePrepareStatement(SQLiteConnection.java)
   at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
   at android.database.sqlite.SQLiteConnection.executeForString(SQLiteConnection.java:634)
   at android.database.sqlite.SQLiteConnection.setJournalMode(SQLiteConnection.java:320)
   at android.database.sqlite.SQLiteConnection.setWalModeFromConfiguration(SQLiteConnection.java:294)
   at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:215)
   at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193)
   at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463)
   at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185)
   at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177)
   at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:808)
   at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:793)
   at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:696)
   at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:680)
   at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:289)
   at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:223)
   at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163)
   at com.myapp.DBConnect.getInstance(DBConnect.java:202)
   at com.myapp.MyApplication.onCreate(MyApplication.java:66)

我尝试进行的每次搜索都听起来像是问题在于尝试从不同的线程打开数据库.但是,我认为我可以通过在helper类中使用静态方法来获取当前实例的方式来避免这种情况.

Every search I try makes it sound like the issue is with trying to open the database from different threads. However, I thought I had a setup to avoid this by having a static method in the helper class to get the current instance.

private static DBConnect mInstance = null;
private static SQLiteDatabase db;

public static DBConnect getInstance(Context ctx) {
    if (mInstance == null) {
        mInstance = new DBConnect(ctx.getApplicationContext());
        db = mInstance.getWritableDatabase(); // this is line 202 in DBConnect.java
        // all methods in this class reference this db var to run database queries
    }
    return mInstance;
}

然后在需要访问数据库的任何地方,我都使用此行设置了局部变量db:

and then wherever i need to access the database I have a local variable db set by using this line:

// this is line 66 in MyApplication.java
DBConnect db = DBConnect.getInstance(this);

然后使用 db.addItem()

它一直运行良好,我90%确信多个线程正在访问相同的表,而我从未见过崩溃.该应用程序有几个列表,这些列表在后台在多个位置同步,最容易重现的是应用程序首次启动时执行这些列表的同步.在同步时,用户可以查看不同的列表,正在加载每个列表是从数据库中选择其内容,可能是在后台同步过程中从同一表中添加或删除项目时.我每天也有数百个活跃用户,并且在过去几个月中仅出现过15次此类崩溃.

It has been working fine and I am 90% sure multiple threads are accessing the same tables without me ever seeing crashes. The app has a couple lists which sync in the background in several places, the easiest one to reproduce is when the app first launches it performs a sync of these lists. While it is syncing the user can view the different lists, loading each list is selecting its contents from the database, possibly while items are being added or deleted from the same tables in the background sync process. I also have a couple hundred active users a day and have only seen this kind of crash 15 times over the last few months.

此外,看到错误的第一行是 java.lang.RuntimeException:无法创建应用程序... ,当用户首次启动应用程序时似乎正在发生这种情况?不确定此时是否已经有多个线程,除非用户登录,否则任何后台进程都不会运行.

Also, seeing that the first line of the error is java.lang.RuntimeException: Unable to create application ..., It seems like this is happening when the user first launches the app? Not sure how there could already be multiple threads at this point, none of the background processes run unless the user has signed in.

我还看到由同一行引起的以下错误:

I am also seeing the following error caused by the same line:

Failed to change locale for db '/data/user/0/com.myapp/databases/mydb' to 'en_US'.

我尝试更改手机上的语言环境设置,重新安装该应用程序,然后四处乱逛,看看是否遇到此问题.在使用其他语言环境进行安装后,我什至尝试切换回英语,但无法再次发生此崩溃.我觉得它们可能相关,因为它们似乎都在启动时发生.

I have tried changing locale settings on my phone, reinstalling the app and then messing around to see if i get this problem. I even tried switching back to English after installing using another locale but have not been able to repeat this crash. I have a feeling they might be related since they both seem to be happening on startup.

推荐答案

在我的情况下,我没有授予运行时权限.我将数据库文件保存在外部存储中,当要求获得许可时,我拒绝了该文件,但是当允许许可时,它就可以正常工作.在SDK版本> = 23上,您必须授予运行时权限.

In my case I did not give runtime permission. I kept my database file in external storage and when asked for permission I denied it, but when allowed permission it was working fine. On SDK version >= 23 you have to give runtime permission.

这篇关于SQLiteDiskIOException:磁盘I/O错误(代码1802):,而在编译时:PRAGMA journal_mode的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆