刷新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 + CloudKit 不会在其他设备上自动刷新?
在后台线程上安全保存 Core Data 托管对象上下文的正确方法?
如何为一对多关系正确配置 Core Data 数据模型和 NSManagedObject?