gpt4 book ai didi

iphone - iOS 应用程序 sqlite3 上的离线缓存损坏

转载 作者:可可西里 更新时间:2023-11-01 05:38:25 25 4
gpt4 key购买 nike

我有一个用于 iOs 应用程序的 sqlite3 数据库,以便为系统提供离线支持。

它工作得很好。但有时 .db 文件会损坏。并且不返回结果。

如果我通过命令行检查 SELECT 指令,我会收到下一条错误消息:

sqllite Error: database disk image is malformed

虽然不可取,但它会变得腐败。数据库只是一个辅助系统,足以从iOS应用程序检测到文件已损坏并重新启动文件。

但是使用 sqlite3 语句我没有得到任何异常。代码如下:

sqlRaw = @"SELECT ... ";
const char *sql = [sqlRaw cStringUsingEncoding:NSUTF8StringEncoding];
if (sqlite3_prepare_v2(database, sql, -1, &date_statement, NULL) != SQLITE_OK) {
NSAssert1(0, @"Error: failed to prepare statement with message '%s'.", sqlite3_errmsg(database));
}

NSMutableArray *entities = [[NSMutableArray alloc] initWithCapacity:0];
while (sqlite3_step(date_statement) == SQLITE_ROW) {
NSData *entityXml = [[NSData alloc] initWithBytes:sqlite3_column_blob(date_statement, 0)
length:sqlite3_column_bytes(date_statement, 0)];
[entities addObject:entityXml];
}
sqlite3_finalize(date_statement);

当应用程序执行前面的代码时,只返回一个空数组,不会抛出异常。

有人知道如何从 sqlite3 语句检查 .db 文件状态吗?

也许使用其他存储系统会更好。有什么推荐吗?

最佳答案

最后我决定从应用程序中检查数据库状态,如果数据库已损坏,只需更换一个新的空数据库。

- (BOOL) isDatabaseCorrupted {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:cache_final_path];
BOOL bResult = FALSE;
if (sqlite3_open([path UTF8String], &database) == SQLITE_OK) {
@try {
NSString *sqlRaw = @"PRAGMA integrity_check;";
const char *sql = [sqlRaw cStringUsingEncoding:NSUTF8StringEncoding];
if (sqlite3_prepare_v2(database, sql, -1, &check_statement, NULL) == SQLITE_OK) {
int success = sqlite3_step(check_statement);
NSLog(@"SQL integrity_check result is %d", success);
NSString *response = nil;
switch (success) {
case SQLITE_ERROR:
bResult = TRUE;
break;
case SQLITE_DONE:
NSLog(@"Result is simple DONE of the sqllite3 on isDatabaseCorrupted");
break;
case SQLITE_BUSY:
NSLog(@"Result is simple BUSY of the sqllite3 on isDatabaseCorrupted");
break;
case SQLITE_MISUSE:
NSLog(@"Bad utilization of the sqllite3 on isDatabaseCorrupted");
break;
case SQLITE_ROW:
response = [NSString stringWithUTF8String:(char *)sqlite3_column_text(check_statement, 0)];
if ([[[response lowercaseString] stringByTrimmingCharactersInSet:[NSCharacterSet
whitespaceAndNewlineCharacterSet]]
isEqualToString:@"ok"]){
bResult = FALSE;
} else {
NSLog(@"ATTENTION: integrity_check response %@", response);
bResult = TRUE;
}
break;
default:
break;
}

sqlite3_finalize(check_statement);
}

}
@catch (NSException *exception) {
[TSLogger log:[NSString stringWithFormat:@"Exception %@", [exception description]]
withSeverity:severity_error];
return TRUE;
}
}

sqlite3_close(database);
return bResult;
}

结果是按照 sqlite3 文档中预期响应的顺序定义的。

谢谢,

伊凡

关于iphone - iOS 应用程序 sqlite3 上的离线缓存损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9411689/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com