刷新Core Data数据库的正确方法

Posted

技术标签:

【中文标题】刷新Core Data数据库的正确方法【英文标题】:Correct way to refresh Core Data database 【发布时间】:2011-02-05 22:16:23 【问题描述】:

我的应用程序已设置为在首次使用时会从基于 Web 的 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】:

执行此操作的“正确”方法是获取所有对象,删除每个对象,然后保存上下文。 (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];
    


然后你可以重新创建你的对象。

【讨论】:

我认为“if (array == nil)”应该是“if (array != nil)”

以上是关于刷新Core Data数据库的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

Core Data 数据库正确存储

Core Data + CloudKit 不会在其他设备上自动刷新?

在后台线程上安全保存 Core Data 托管对象上下文的正确方法?

如何为一对多关系正确配置 Core Data 数据模型和 NSManagedObject?

NSFetchedResultsController(Core Data)不提供正确的数据源表视图控制器

Core Data