呸!试图重置核心数据。每秒工作一次?

Posted

技术标签:

【中文标题】呸!试图重置核心数据。每秒工作一次?【英文标题】:Gah! Trying to reset Core Data. Works every second time? 【发布时间】:2012-03-26 15:59:46 【问题描述】:

好的,所以我的应用程序委托创建了所有核心数据内容,然后我发送到我的第一个视图控制器。

我的第一个视图控制器是一个 NSURLConnectionDelegate...在 connectionDidFinishLoading 方法中,我想擦除 persistentStore 并重新创建它...然后从 XML 文件解析/重新填充它。

这是我的 connectionDidFinishLoading 代码:

-(void)connectionDidFinishLoading:(NSURLConnection *)connection 

//I believe I should nil out the context...
managedObjectContext = nil;

//Erase the persistent store from coordinator and also file manager.
NSError *error = nil;
NSPersistentStore *store = [self.persistentStoreCoordinator.persistentStores lastObject];
NSURL *storeURL = store.URL;
[persistentStoreCoordinator removePersistentStore:store error:&error];
[[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error];


//Make new persistent store and add to the coordinator  
if (![self.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) 

else 
    //Store is readied, now recreate the managedObjectContext
    id appDelegate = (id)[[UIApplication sharedApplication] delegate];
managedObjectContext = [appDelegate managedObjectContext];

   //Call the parser!
    [self parseXML];
  

我知道这里出了点问题……只是想不通。它在我构建/运行时每秒钟工作一次。当我尝试在解析器方法中保存 managedObjectContext 时出现错误

谁能提供我如何解决此问题的示例代码?

提前致谢,

【问题讨论】:

您正在为协调员和文件管理器传递&error - 每次调用后您会返回什么错误 - NSLog("%@", error); ;) 没有得到任何错误...错误出现在 [parseXML] 方法的后面。但我知道它与这个粘贴的代码有关......如果我取出所有持久存储删除位并且只是 [parseXML] 它可以工作 我得到的错误是关于“if (![managedObjectContext save:&error])”,是的……我每第二次运行应用程序时才会收到错误。错误是“EXC_BAD_ACCESS” 你是如何创建/保留你的 managedObjectContext 的? managedObjectContext 是使用标准核心数据方法从应用程序委托创建/传递的。但是是的,managedObjectContext 似乎确实在应用程序的第二次构建/运行时被释放或某些东西......该属性被声明为“@property (nonatomic, strong) NSManagedObjectContext *managedObjectContext;” 【参考方案1】:

我能够得到这个工作

(在我的视图控制器中)

-(void)connectionDidFinishLoading:(NSURLConnection *)connection 

id appDelegate = [[UIApplication sharedApplication] delegate];
[appDelegate resetCoreData];

self.managedObjectContext = [appDelegate managedObjectContext];
[self parseXML];   

(在我的应用委托中)

- (void)resetCoreData;


NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"deleteme.sqlite"];

NSFileManager *fileManager = [NSFileManager defaultManager];


    [fileManager removeItemAtURL:storeURL error:NULL];

    NSError* error = nil;

    if([fileManager fileExistsAtPath:[NSString stringWithContentsOfURL:storeURL encoding:NSASCIIStringEncoding error:&error]])
    
        [fileManager removeItemAtURL:storeURL error:nil];
    

self.managedObjectContext = nil;
self.persistentStoreCoordinator = nil;


【讨论】:

以上是关于呸!试图重置核心数据。每秒工作一次?的主要内容,如果未能解决你的问题,请参考以下文章

UIButton 文本内容每秒更新一次

RestKit 重置核心数据存储

在列命令按钮重置中合并单元格

核心数据:重置为初始状态

核心数据:使用 loadPersistentStores 设置时如何重置所有内容?

在初始加载时快速重置核心数据属性标志?