2009-11-22 2 views
9

У меня есть приложение, которое извлекает данные из Интернета и использует CoreData для их хранения в устройстве для более плавного использования.Протрите все данные, хранящиеся в CoreData, когда модель изменилась

Поскольку я использую основные данные, каждый раз, когда изменяется моя схема, приложение падает, когда я пытаюсь запустить его с предыдущими данными, хранящимися на устройстве. Какой самый быстрый способ обнаружить это изменение и стереть все данные с устройства, так как я не возражаю, чтобы переустановить их все. Он бьет сбой и переназначает схему на новую (в моем случае).

Я вижу, что эта проверка выполняется в поглотителе:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator 

поэтому мне нужно только знать методологию реализации для вытирания всей базы данных и снова седений до Core Data. Спасибо :)

ответ

14

Возвращаясь к этому вопросу, чтобы удалить все данные из моего хранилища CoreData, я решил просто удалить файл базы данных sqlite. Так что я просто реализовал NSPersistentStoreCoordinator так:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 

    if (persistentStoreCoordinator != nil) { 
     return persistentStoreCoordinator; 
    } 

    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"myAppName.sqlite"]]; 

    NSError *error = nil; 
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 
    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]) { 

     NSLog(@"Error opening the database. Deleting the file and trying again."); 

     //delete the sqlite file and try again 
     [[NSFileManager defaultManager] removeItemAtPath:storeUrl.path error:nil]; 
     if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]) { 
      NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
      abort(); 
     } 

     //if the app did not quit, show the alert to inform the users that the data have been deleted 
     UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Error encountered while reading the database. Please allow all the data to download again." message:@"" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] autorelease]; 
     [alert show]; 
    } 

    return persistentStoreCoordinator; 
} 
+0

+1 Так как никто не предложил лучшей альтернативы ... – RedBlueThing

+0

Я на самом деле с помощью этого сейчас ... Не удалось найти хорошую альтернативу. – Dimitris

 Смежные вопросы

  • Нет связанных вопросов^_^