Android 可能导致SQLiteDiskIOException的原因:磁盘I/O错误(代码522)
应用程序可能有多个线程正在访问sqlite数据库。在一个函数中,它执行一个简单的查询:Android 可能导致SQLiteDiskIOException的原因:磁盘I/O错误(代码522),android,sqlite,android-sqlite,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); 应用程序大部分时间都在工作,
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))
看见
(522)SQLITE\u IOERR\u SHORT\u READ
SQLITE_IOERR_SHORT_读取错误代码是SQLITE_IOERR的扩展错误代码,表示VFS层中的读取尝试无法获得请求的字节数。这可能是由于文件被截断
不知道怎么读。
522错误的原因可能是什么。如果这是由于其他线程正在访问数据库引起的,如何确保该解析器.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;
}
数据库文件已损坏。用最新的备份替换它。谢谢!重新启动应用程序,它工作正常。不确定是否数据库文件已损坏。不知道如何替换Android上备份的数据库文件,有什么建议吗?