核心数据:重新启动App后,将其他对象插入到托管对象上下文中

时间:2012-01-01 15:49:27

标签: ios core-data nsmanagedobject

加载Root View Controller后,应使用便捷方法创建一个名为 Target 的托管对象:

- (void)viewDidLoad {
    [super viewDidLoad];

    if (context == nil) { 
       context = [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
    }

    if ([fetchedResultsController.fetchedObjects count] < 1) {
       Target *aTarget = (Target *)[NSEntityDescription insertNewObjectForEntityForName:@"Target" inManagedObjectContext:context]; 
    }

    NSError *error; 
    if (![[self fetchedResultsController] performFetch:&error]) {
       // Update to handle the error appropriately.
       NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    }

     if(![context save:&error]){  
       //Handle error.
     } ...

如果我从Xcode上运行我的iPhone上的应用程序,它可以正常工作。但是,如果我停止测试运​​行并在iPhone上重新启动应用程序,即使条件

,也会创建一个新的受管对象
[fetchedResultsController.fetchedObjects count] < 1) 

似乎并不满意(最后,我只是不知道为什么)。一旦应用程序独立于Xcode在电话上运行,我可以关闭并重新启动它,而不会增加创建的托管对象的数量。仅在与Xcode断开连接后的第一次。 备注:与Xcode断开连接会导致 Segmentation fault:11 错误,当我从Xcode断开另一个Core Data App时,也会出现错误。所以我不会将此错误归因于我的问题。 有任何想法如何阻止App创建这个额外的对象?您需要更多代码才能找出问题吗?非常感谢。

2 个答案:

答案 0 :(得分:1)

仅仅基于我能看到的代码,我认为这段代码将在每次运行应用程序时第一次运行代码时创建一个新对象。

尝试切换第2个和第3个if语句,以便首先执行提取。我会给你代码,但代码格式化真的很难从我的iPad上使用。

答案 1 :(得分:1)

Thuggish Nuggets&amp; adonoho,非常感谢你的帮助。你引导我朝着正确的方向前进。我按照建议切换了两个语句,并在从托管对象上下文中检索对象时添加了以下条件:

if ([fetchedResultsController.fetchedObjects count] > 0) {
  id currObj = [fetchedResultsController.fetchedObjects objectAtIndex:0];  
}

在没有这个条件的情况下,当切换两个语句时,我得到NSRangeExeption错误([__NSArrayI objectAtIndex:]:索引0超出空数组的边界)。 根据您的建议,重新启动应用程序时不会创建新对象。非常感谢!