什么可能导致SQLiteDiskIOException:磁盘I / O错误(代码522)

时间:2017-04-27 13:03:52

标签: android sqlite android-sqlite

应用程序可能有多个访问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;

}

0 个答案:

没有答案