Правильный способ обновления базы данных Core Data - PullRequest
2 голосов
/ 06 февраля 2011

Мое приложение настроено таким образом, что при первом использовании оно загружает необходимые данные из веб-канала xml.

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

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

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

- (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;
}

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

Этот NSPersistentStoreCoordinator не имеет постоянных хранилищ. Невозможно выполнить операцию сохранения.

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

1 Ответ

1 голос
/ 07 февраля 2011

«Правильный» способ сделать это - просто извлечь все объекты, удалить каждый из них, а затем сохранить контекст. (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];
    }

}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...