2016-04-22 2 views
1

У нас есть код для определения, нет ли в данный момент файла базы данных. Если это так, мы выполняем некоторые процедуры инициализации для заполнения базы данных пользователя на основе некоторых файлов, которые могут существовать в файловой системе (в основном, процедуры миграции).CoreData обнаруживает несогласованность базы данных при запуске

Процедура, в основном, как этот

NSURL * defaultStorePath = [NSPersistentStore MR_defaultLocalStoreUrl]; 
BOOL initializeDatabase = ![[NSFileManager defaultManager] fileExistsAtPath:[defaultStorePath path]];  

[MagicalRecord setupCoreDataStackWithAutoMigratingSqliteStoreAtURL:defaultStorePath]; 

if(initializeDatabase) 
    // ... ingest user files ... 

Так это хорошо работает, если файл .sqlite нет. Однако, если файлы .sqlite-wal или .sqlite-shm отсутствуют/повреждены, мы не можем найти способ обнаружить этот сценарий.

Мы хотели бы сделать проверку целостности данных или что-то в этом случае.

ответ

1

Без MagicalRecord:

NSURL *storeURL = ... 
NSError *error; 
NSPersistentStore *persistentStore = [_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]; 

if (persistentStore) { 
    // further initialization 
} else { 
    switch (error.code) { 
     case NSFileReadCorruptFileError: { 
      NSLog(@"database corrupted."); 
      // delete .sqlite, -wal and -shm 
      // make another attempt to add persistent store 
      break; 
     } 
     case NSPersistentStoreIncompatibleVersionHashError: { 
      NSLog(@"database model updated."); 
      // migrate 
      break; 
     } 
     default: { 
      NSLog(@"unresolved error %@", error.localizedDescription); 
      abort(); 
     } 
    } 
} 
+0

Возможно, мы сможем запросить функцию с помощью MagicalRecord, чтобы помочь нам справиться с отказами. благодаря – yano

1

Вот пример, и я надеюсь, что это будет полезно.

func configurePersistentStore() { 
    let nc = NSNotificationCenter.defaultCenter() 
    nc.addObserver(self, selector:#selector(self.dataBaseWillBeRecreated(_:)), name:kMagicalRecordPSCMismatchWillDeleteStore, object:nil) 

    MagicalRecord.setLoggingLevel(MagicalRecordLoggingLevel.Warn) 
    // if sqlite database does not match the model you provided, delete store. 
    // MagicalRecord.setShouldDeleteStoreOnModelMismatch(true) 
    MagicalRecord.setupCoreDataStackWithStoreNamed(kPersistentStoreName) 

    if ESGlobal.sharedInstance().firstRun { // User first run your app after installation. 
     self.fillDefaultDataToSQLiteDB() // fill data 
    } 
}