2011-05-10 100 views
0

我有一个窗口,其中包含一个包含核心数据对象的列表,以及一个显示窗口,当您选择一个窗口时会打开。NSArrayController和核心数据不像预期的那样运行

显示窗口中的某个动作将核心数据对象标记为“读取”。

要打开一个对象,我将该对象传递给显示窗口,以及显示该列表的sortDescriptors和filterPredicate,以便显示窗口可以向前/向后导航(主窗口有时会显示一个对象的子集,这就是为什么我需要sortDescriptors和filterPredicate)。

将打开的对象标记为已读完美。由于KVO,它会自动在主窗口中更新。

但是,当我向前/向后导航到显示窗口中的其他对象时,标记为已读不再有效。我遍历代码并看到代码执行,检查新值,并将其标记为已读 - 但这并不反映在主窗口或数据库中。

有没有什么明显的可能导致这个?我不是在任何时候创建核心数据对象的副本。显示窗口使用NSArrayController来获取数据,并将sortDescriptors和filterPredicate应用于它。我的代码,以获得下一个对象是这样的:

-(MyObject *object)nextObject { 

    // _object is the object being displayed by the display window. 
    // _listContainingObject is an NSArrayController set to Entity: Object 

    NSArray *list = [_listContainingObject arrangedObjects]; 

    NSUInteger positionInList = 0; 
    for (MyObject *object in list) { 

     if ([[[object objectID] URIRepresentation] isEqualTo: [[_object objectID] URIRepresentation]]) {   break; 
     } 
     positionInList++; 
    } 

    if (positionInList == [list count] - 1) return nil; 

    if (positionInList + 1 > [list count] - 1) return nil; 

    MyObject *object = [list objectAtIndex: positionInList + 1]; 

    return object;  

} 

这真的好像我遇到了核心数据的一些隐藏的疑难杂症,如物体拉出一个不同的NSArrayController的都是复印件......但一切都运行关闭相同的ManagedObjectContext。 NSArrayController的托管对象上下文绑定到我的应用程序委托的属性,该属性返回其他所有使用的相同上下文。我在这个问题上很努力地抓我的头。

回答

2

请记住,当您正在处理项目时,您的managedObjectContext充当便笺。在您实际保存托管对象上下文之前,您对托管对象的更改不会反映到数据库中。

因此,在将项目标记为已读或未读之后,您需要保存上下文。

NSError *saveContextError=nil; 
if (![yourManagedObjectContext save:&saveContextError){ 
    // Handle the error 
    NSLog(@"managedObjectContext save error: %@",error); 
} 
+0

不幸的是,这不是它 - 我保存任何时间进行更改。 – 2011-05-19 18:48:51

+0

我接受这是正确的,因为它足够接近 - 事实证明,我正在处理不同的托管对象上下文,出于某种原因,尽管应用程序委托返回相同的对象。仍然非常不稳定,但它似乎现在工作。 – 2011-05-19 23:02:08

相关问题