【问题标题】:Android SQLiteDiskIOException in getReadableDatabase(), native_setLocale, SQLiteOpenHelpergetReadableDatabase()、native_setLocale、SQLiteOpenHelper 中的 Android SQLiteDiskIOException
【发布时间】:2012-12-20 15:35:25
【问题描述】:

最近我遇到了一个与使用 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。

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

【问题讨论】:

    标签: android sqlite exception sqliteopenhelper setlocale


    【解决方案1】:

    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)

    【讨论】:

    • 谢谢。我在 Altaf 的回答下发表了关于多重访问的评论。至于您发布的帖子,我已经阅读了它,但是我认为更改数据库路径没有意义,因为我没有指定它...?
    【解决方案2】:
    1. 此类错误主要发生在您同时执行两项操作时。
    2. 当您错误地关闭或打开数据库时。例如,在关闭数据库然后触发查询时。

    【讨论】:

    • 我再次查看了代码,确实,并发访问的可能性很小(其中一种方法上没有同步关键字)。并发的可能性很小,用户必须进入应用程序设置并在后台服务访问数据库时点击“清除缓存”(它每 3 小时执行一次)。但这可能是问题所在。谢谢。在我的情况下,第二个选项是不可能的。
    猜你喜欢
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 2011-07-23
    • 1970-01-01
    相关资源
    最近更新 更多