Автономный кеш в приложении 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 Cipher IOS
  • Параметры guarded_open_np
  • va_args () вызывает EXC_BAD_ACCESS
  • Запрос Sqlite с вопросительным знаком
  • Какая версия sqlite предоставляет iOS?
  • Ошибка приложения с сообщением о сбое при обновлении базы данных SQLite
  • Ошибка компиляции при использовании sqlite3: свойство с атрибутом «сохранить (или сильным)» должно быть типа объекта
  • ON DELETE CASCADE не работает в sqlite3 в ios
  • Как добавить и выполнить .sql-файлы в моем проекте iOS?
  • Как импортировать файл .sqlite3 / .sqlite в приложение ios?
  • Открытие и создание базы данных SQLite в Objective C
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.