2

最近我遇到了一个与使用 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() 后抛出异常,在堆栈中可见。

请注意,这个类被许多线程访问,但访问是完全同步的(锁+只有一个,同一个类实例)。应用程序可以移动到 sdcard(也许这就是问题?)。

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

有任何想法吗?我知道这个问题不太常见,但我还没有找到任何解决方案......

4

2 回答 2

0
  1. 这种类型的错误主要发生在您同时执行两个操作时。
  2. 当您错误地关闭或打开数据库时。例如,当关闭数据库然后触发查询时。
于 2012-12-20T16:07:18.883 回答
0

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

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

Environment.getDataDirectory() + "/data/YOUR_APP_PACKAGE/databases/";

阅读: 数据库处理停止在 Android 2.2.1 上运行(Desire HD 1.72.405.3)

于 2012-12-20T16:08:47.853 回答