应用程序可能有多个访问sqlite数据库的线程。在一个函数中,它执行一个简单的查询:
ContentResolver resolver = context.getContentResolver();
final Cursor cursor = resolver.query(Data.CONTENT_URI, Data.PROJECTION,
Data.Id + "=?", new String[] { id + "" }, null);
该应用程序大部分时间都可以运行,但是在此resolver.query行上看到报告崩溃了。
SQLiteDiskIOException: disk I/O error (code 522)
#################################################################
Error Code : 522 (SQLITE_IOERR_SHORT_READ)
Caused By : Disk I/O error occurred during 'short read' operation.
(disk I/O error (code 522))
见https://sqlite.org/rescode.html#ioerr_short_read
(522)SQLITE_IOERR_SHORT_READ
SQLITE_IOERR_SHORT_READ错误代码是SQLITE_IOERR的扩展错误代码,表示VFS层中的读取尝试无法获取所请求的字节数。这可能是由于截断文件造成的。
不确定如何阅读。 这可能是造成522错误的原因。如果它是由某些其他线程访问数据库引起的,如何确保此resolver.query()不会被其他线程中断(对于其他线程的数据库查询也是如此)?
数据库是
mOpenHelper = new SQLiteOpenHelper(context, name, null, version);
,查询/更新/ ...就像
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
// simplified snippet
final SQLiteDatabase db = mOpenHelper.getReadableDatabase();
Cursor cursor = db.rawQuery(selection, selectionArgs);
return cursor;
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
// simplified snippet
final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
String sql = selection;
SQLiteStatement updateStatement = db.compileStatement(sql);
int numberOfRowsUpdated = updateStatement.executeUpdateDelete();
return numberOfRowsUpdated;
}