Автономный кеш в приложении iOS sqlite3 становится поврежденным

У меня есть база данных sqlite3 для приложения iOs, чтобы обеспечить автономную поддержку системы.

Он работает отлично. Но иногда файл .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?

Может быть, лучше для пользователей другой системы хранения. Любая рекомендация?

One Solution collect form web for “Автономный кеш в приложении iOS sqlite3 становится поврежденным”

Наконец, я решил проверить из приложения статус базы данных, и если база данных повреждена, просто замените новую пустую базу данных.

 - (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.

Спасибо,

Иван

  • Выбирать оператор в SQLite, определяющем номер строки
  • «база данных заблокирована» в sqlite в iPhone
  • Невозможно подключить базу данных SQLite в iOS
  • ON DELETE CASCADE не работает в sqlite3 в ios
  • Создание файла базы данных SQLite3 через Objective-C
  • Как запросить внешнюю базу данных SQL - приложение для iPhone
  • Ошибка sqlite3_prepare_v2 - Уже выполняется предыдущий запрос
  • Как скопировать базу данных sqlite при запуске приложения в iOS?
  • отладка заблокированной базы данных sqlite3
  • iOS: приложение с несколькими запросами
  • Как вставить строку, содержащую символ в sqlite ios
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.