最近我遇到了一个与使用 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。
有任何想法吗?我知道这个问题不太常见,但我还没有找到任何解决方案......