2011-02-05 6 views
2

Мое приложение настроено так, что, когда оно впервые используется, оно загружает требуемые данные из веб-корневой XML-ленты.Правильный способ обновления базы данных Core Data

Пользователь также имеет возможность периодически обновлять данные с помощью настройки.

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

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

- (void)resetApplicationModel { 

NSURL *_storeURL = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: DBSTORE]]; 
NSPersistentStore *_store = [persistentStoreCoordinator persistentStoreForURL:_storeURL]; 
[persistentStoreCoordinator removePersistentStore:_store error:nil]; 
[[NSFileManager defaultManager] removeItemAtPath:_storeURL.path error:nil]; 

[persistentStoreCoordinator release], persistentStoreCoordinator = nil; 
} 

Однако это не работает, при выполнении обновления данных, он загружает данные, но не может сохранить его в базе данных и генерирует следующее сообщение об ошибке в консоли;

Этот NSPsistentStoreCoordinator не имеет постоянных магазинов. Он не может выполнить операцию сохранения.

Что такое «правильный» способ обновления базы данных?

ответ

1

«Правильный» способ сделать это - просто извлечь все объекты, удалить каждый из них, а затем сохранить контекст. (Http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdFetching.html)

- (void) deleteAllEntitiesForName:(NSString*)entityName { 
    NSManagedObjectContext *moc = [self managedObjectContext]; 
    NSEntityDescription *entityDescription = [NSEntityDescription 
     entityForName:entityName inManagedObjectContext:moc]; 
    NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; 
    [request setEntity:entityDescription]; 
    NSError *error = nil; 
    NSArray *array = [moc executeFetchRequest:request error:&error]; 
    if (array != nil) { 
     for(NSManagedObject *managedObject in array) { 
      [moc deleteObject:managedObject]; 
     } 
     error = nil; 
     [moc save:&error]; 
    } 

} 

Тогда вы можете просто обновить свои объекты.

+0

Я думаю, что "if (array == nil)" должно быть "if (array! = Nil)" –

+0

Да, вы правы, спасибо. Я отредактировал мой код, чтобы исправить его. –

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