getReadableDatabase()中的Android SQLiteDiskIOException,本机设置语言环境,SQLiteOpenHelper
最近,我遇到了一个与使用SQLiteOpenHelper有关的问题。 很少有用户报告了我无法再现的错误:getReadableDatabase()中的Android SQLiteDiskIOException,本机设置语言环境,SQLiteOpenHelper,android,sqlite,exception,sqliteopenhelper,setlocale,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(SQLiteDat
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)
所以这里没什么特别的。该异常在getReadableDatabase()调用后引发,在堆栈中可见
注意,这个类被许多线程访问,但是访问是完全同步的(锁+只有一个,相同的类实例)。应用程序可以移动到SD卡(也许这就是问题所在?)
不幸的是,我不知道问题发生在哪个设备/安卓版本上(平台:Google Play console中的其他),但在谷歌搜索之后,我怀疑是安卓v2.2.1
有什么想法吗?我知道这个问题不太常见,但我还没有找到任何解决办法
我再次查看了代码,事实上,并发访问的可能性很小(其中一个方法上没有同步关键字)。并发的可能性很小,用户必须输入应用程序设置,并在后台服务访问数据库时点击“清除缓存”(每3小时一次)。但这可能是个问题。谢谢第二种选择在我的情况下是不可能的。谢谢。我在Altaf的回答下发布了一条关于多重访问的评论。至于您发布的线程,我已经读过了,但是我认为更改数据库路径没有意义,因为我没有指定它。。。?
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;
}
(...)
}