0

长问题---提前感谢您的时间。保存新的托管对象后,我发现它们已添加到我的核心数据数据库中另一个对象的关系中——我的代码没有为此调用 setter 方法并且没有反向关系。我仔细研究了代码并使用日志尽可能地隔离事件,但我遇到了我无法解释(或修复)的奇怪行为。

进一步来说:

我有一个名为PendingSyncTracker. 它只有一种关系,objectsToSync。我还没有在我的代码中添加任何行来调用这个关系的 setter 方法。这是一对多的关系。它指向BaseEntity。对于“反向”选项,我选择了“无反向关系”。

当我加载特定的表视图时,会从服务器下载 3 个对象,然后将其解析为托管对象并保存。当表格视图开始加载单元格时,这 3 个对象中的 2 个将神秘地出现在objectsToSync关系中。

我已经使用NSLog了整个代码来准确确定何时可以首先找到这些对象作为objectsToSync集合的成员。

NSSet *objectsToSync = [[[SyncEngine sharedEngine] fetchClassNamed:@"PendingSyncTracker" withPredicates:nil][0] valueForKey:@"objectsPendingSync"];
NSLog(@"PendingSyncTracker objectsToSync set (%lu objects): %@", (unsigned long)[objectsToSync count], objectsToSync);

它们何时首次出现在集合中的答案实际上取决于我在哪里放置/不放置这 2 行代码!

  • 在保存我的 3 个新核心数据对象的过程中保存托管对象上下文之前,永远不会在关系上找到对象。

  • 如果我在返回表视图控制器之前不使用这两条线,该控制器将新对象发送到同步引擎以在本地存储(访问和保存 MOC 的位置),那么日志将在那里显示2 个对象已添加到关系中。

  • 如果我在将 MOC 保存在同步引擎中后立即使用这 2 行,那么日志将指示(在 TVC 中和在 TVC 中)仅将 1 个对象添加到关系中。

  • 如果我在保存 MOC 之前和之后(并返回 TVC)立即使用这 2 行,那么所有 3 条日志都将显示该关系包含一个空集。

  • 我在开头也有这两行cellForRowAtIndexPath。无论之前的日志如何,该日志将始终指示已将 2 个对象添加到关系中。

在同步引擎中创建的所有 3 个托管对象都存储为实体类型,这些实体类型是BaseEntityobjectsToSync关系指向的)的子实体。添加到关系中的 2 种类型均被定义为具有互惠关系,但具有不同的对象,而不是PendingSyncTracker(尽管不同的对象是 BaseEntity 的子实体!)。

那么.. 是什么解释了这些观察结果?这些对象是如何添加到关系中的?

更新:

- (NSArray*) fetchClassNamed:(NSString*)className withPredicates:(id)parameters;
{
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:className inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];

    // set predicates
    if (!(parameters == nil)) {
        [fetchRequest setPredicate:parameters];
    }

    NSError *error;
    NSArray *fetchedResults = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];

    return fetchedResults;
}
4

1 回答 1

1

首先,[[[SyncEngine sharedEngine] fetchClassNamed...做什么?只是一个猜测,但它正在使用 KVC 为您设置关系。

此外,您应该始终、始终始终具有反向关系。即使你从不使用它,Core Data 也可以。没有逆可能会导致很多问题,包括但不限于性能问题和潜在的数据损坏。

添加反向关系并用什么更新您的问题-fetchClassNamed...

于 2013-08-05T23:03:25.707 回答