无法获取核心数据关系中的相关记录,为什么?

时间:2010-07-29 09:50:36

标签: iphone core-data

我必须使用'帐户'和'事件'等实体。

该帐户与事件有很多关系,与事件有反向关系。

现在,当我将一个事件对象保存到帐户时,它运行良好。

但是,当我获取特定相关帐户的事件时,它会为所有可用的实体提供不理想的行为。

我正在传递currentAccount对象,如下所示:

if (PrivarteController == nil) {
        PrivarteController *aController = [[PrivarteController alloc]initWithNibName:@"PrivarteController"
                                                                                          bundle:nil];
        self.PrivarteController = aController;
        [aController release];
    }
    self.PrivarteController.shouldFetchNewCounts = YES;
    self.PrivarteController.currentAccount = [self.fetchedResultsController objectAtIndexPath:indexPath];
    [[self navigationController] pushViewController:self.PrivarteController animated:YES];

在该控制器中,我将相关事件提取到这样的帐户:

    NSFetchRequest *request = [[NSFetchRequest alloc] init];

    NSString *predicateFormat = [NSString stringWithFormat:@"ddtype = 'Home'"];

    NSPredicate *pred = [NSPredicate predicateWithFormat:predicateFormat];
    [request setPredicate:pred];

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"DDEvent" inManagedObjectContext:[self.currentAccount managedObjectContext]];
    [request setEntity:entity];
    [request setResultType:NSManagedObjectResultType];

    NSError *error = nil;
    NSArray *array = [[self.currentAccount managedObjectContext] executeFetchRequest:request error:&error];

在这个请求中假设我在帐户A中有两个Home的事件,在帐户B中有两个Home的事件,所以不是为每个帐户提供2个对象,而是为我提供了两个帐户的所有4个对象,所以这有什么问题。查询。

我不知道出了什么问题?

谢谢,

2 个答案:

答案 0 :(得分:1)

您的谓词必须按帐户过滤 - 它们共享托管对象上下文。

答案 1 :(得分:1)

我不确定我是否正确阅读此内容,因为您谈论的是accountevent个实体,但这些名称未出现在代码中。

尽管如此,我觉得fetch工作正常。您告诉它要抓取DDEvent属性等于ddevent的所有'home'个对象。你说你有四个这样的对象,你得到四个回来。

我认为您的问题是您的获取中存在错误的实体。如果要基于帐户进行搜索,则需要将获取的实体设置为Account实体。然后你告诉谓词走这些关系。使用类似"events.ddevent=='home'"的谓词。这将返回具有该条件的Account实体列表。

更新

fetch返回仅包含一种对象的数组。您将返回 一系列Account个对象 一个{{1}的数组对象。你需要清楚你需要哪个对象。

当你说:

  

在这个请求中假设我有两个   账户A和2中的主页事件   因此,账户B中的家庭事件   给我两个对象   帐户它给了我所有4个对象   因为这两个帐户都有错   查询

您好像希望找回DDEventAccount个对象。现在,您只获取DDEvent个对象。

一旦你清楚自己想要哪个对象,就需要明确你想要的特定对象应该具有哪些属性。现在,现在,您只获取属性'ddevent =='Home'的DDEvent个对象,而没有任何其他属性或关系的记录。如果您希望它们与特定帐户建立关系,则需要将其添加到谓词中。

通常,如果你想在一个关系的另一端有一个特定的对象,你可以获取主要对象然后走它的关系。在这种情况下,如果您希望与DDEvent对象A相关的DDEvent个对象与条件匹配。您将获取Account对象A,然后您将使用谓词来过滤Account集以查找所需的特定directdebits对象。