我有一个使用ContentProvider访问SQLite的应用。在提供者onCreate:
中创建了一个SQLiteOpenHelper实例@Override
public boolean onCreate() {
final Context context = getContext();
mDBHelper = new MyDatabase(context);
return true;
}
在方法insert / update / delete / query中检索的SQLiteDatabase实例不会手动关闭。这些方法都没有标记为同步。从UI和服务启动的多个线程访问ContentProvider。
示例堆栈跟踪:
android.database.sqlite.SQLiteDiskIOException: disk I/O error (code 3850)
at android.database.sqlite.SQLiteConnection.nativeExecuteForChangedRowCount(Native Method)
at android.database.sqlite.SQLiteConnection.executeForChangedRowCount(SQLiteConnection.java:734)
at android.database.sqlite.SQLiteSession.executeForChangedRowCount(SQLiteSession.java:754)
at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:64)
at android.database.sqlite.SQLiteDatabase.updateWithOnConflict(SQLiteDatabase.java:1574)
at android.database.sqlite.SQLiteDatabase.update(SQLiteDatabase.java:1520)
at com.sample.provider.MyProvider.update(SourceFile:0)
at android.content.ContentProvider$Transport.update(ContentProvider.java:260)
at android.content.ContentResolver.update(ContentResolver.java:1040)
当我添加一个使用HandlerThread中的Looper初始化的Handler序列化写入某些表的类时,事情一直很顺利。在此之后,我开始看到大量SQLiteDiskIOExceptions,错误代码为3850和0(不是错误?)。有趣的是,这些崩溃中有90%发生在Nexus 4和少数其他设备上。
我一直在运行单元测试,试图模拟条件,但无法重现问题。还有其他问题已经讨论过相关问题(例如:Synchronize access to Content Provider),但对我来说,这个错误的原因似乎还有点不清楚。那么3850错误的原因究竟是什么?