getReadableDatabase(),native_setLocale,SQLiteOpenHelper中的Android SQLiteDiskIOException

时间:2012-12-20 15:35:26

标签: android sqlite exception sqliteopenhelper setlocale

最近我遇到了与使用SQLiteOpenHelper相关的问题。 很少有用户报告我无法重现的错误:

android.database.sqlite.SQLiteDiskIOException: disk I/O error
at android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method)
at android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:1987)
at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1855)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820)
at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:197)

我的实施如下:

public class SqliteDatabase extends SQLiteOpenHelper
{
    public SqliteDatabase(Context context, String dbName, int dbVersion)
    {
        super(context, dbName, null, dbVersion);
        this.context = context;
        this.dbName = dbName;
        this.dbVersion = dbVersion;
    }
    (...)
}

这里没什么特别的。在getReadableDatabase()调用之后抛出异常,如在堆栈中可见。

请注意,许多线程都接受此类,但访问完全同步(锁定+只有一个,同一个类实例)。应用程序可以移动到SD卡(可能这是问题?)。

不幸的是我不知道问题发生在哪个设备/ Android版本上(平台:Google Play控制台中的其他版本),但在做了一些谷歌搜索之后我怀疑它是Android v2.2.1。

有什么想法吗?我知道问题更为常见,但我还没有找到任何解决方案......

2 个答案:

答案 0 :(得分:0)

  1. 当您同时执行两项操作时,会发生此类错误。
  2. 错误地关闭或打开数据库时。例如,关闭数据库然后触发查询。

答案 1 :(得分:0)

  

SQLiteDiskIOException 与多个访问同时相关   对于您的数据库,一个线程尝试获取数据而另一个线程   试图同时插入数据。

但有时如果您使用以下内容获得“磁盘I / O错误”,则DB_PATH似乎可以解决问题:

  

Environment.getDataDirectory()+“/ data / YOUR_APP_PACKAGE / databases /”;

读到这个: Database handling stoped working on Android 2.2.1 (Desire HD 1.72.405.3)