persistentstorecoordinator код ошибки sqlite: 522 'не ошибка'

17

Я работаю над проектом iOS, который занимается миграцией, используя разные версии моих исходных кодов.

Я также попытался окружить оператор if в catch, и он возвращает код ошибки 522 sqlite.

Здесь что-то не так?

мой следующий код:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator{
  if (__persistentStoreCoordinator != nil) {
    return __persistentStoreCoordinator;
  }
  NSURL *storeURL = [[self applicationDocumentsDirectory]     
  URLByAppendingPathComponent:@"coredatadb.sqlite"];
  NSError *error = nil;
  __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

  NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
  [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
  [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

  if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]){

      [[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil];
      [__persistentStoreCoordinator release];
      __persistentStoreCoordinator = nil;
      return [self persistentStoreCoordinator];
  }

  return __persistentStoreCoordinator;
    
задан kevinl 16.08.2013 в 17:34
источник

2 ответа

3

Итак, похоже, что следующее решение моей конкретной проблемы, хотя некоторые люди будут советовать не изменять режим ведения журнала в вашей базе данных sqlite:

// Change journal mode from WAL to MEMORY
NSDictionary *pragmaOptions = [NSDictionary dictionaryWithObject:@"MEMORY" forKey:@"journal_mode"];

 NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
 [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
 [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, 
 pragmaOptions, NSSQLitePragmasOption, nil];
    
ответ дан kevinl 20.08.2013 в 19:43
источник
  • Thnaks для вашего ввода. Добавляя к точке Кевина, мы можем использовать «DELETE» вместо «MEMORY» sqlite.org/pragma.html#pragma_journal_mode –  Boobalan 27.11.2015 в 02:53
39

Изменяя режим ведения журнала, вы избегаете этой проблемы, но не исправляете ее. Новый режим ведения журнала предоставляет вашему приложению некоторые преимущества, такие как скорость.

Реальная проблема заключается в том, что вы удаляете только один файл, а не все 3, которые используются в этом режиме. Существует не только файл coredatadb.sqlite, но также файл coredatadb.sqlite-shm и coredatadb.sqlite-wal. Что-то о схеме и переписывании или так, проверьте видео WWDC 2013 по основным данным для деталей.

Чтобы устранить проблему, вы должны удалить все файлы в каталоге «Документы», начинающиеся с «coredatadb.sqlite», и все снова и снова, -)

Обновление для iOS 9: теперь проще и безопаснее использовать destroyPersistentStoreAtURL или replacePersistentStoreAtURL. См. Сессию WWDC 2015 220_hd_whats_new_in_core_data.

    
ответ дан MacMark 28.11.2013 в 15:15
источник
  • Это правильный ответ. Используйте этот другой ответ SO, чтобы удалить файлы, соответствующие определенному шаблону: stackoverflow.com/questions/6179667/... –  Jeremy White 16.02.2016 в 23:17