断言多对多关系核心数据

时间:2011-09-26 09:00:03

标签: iphone core-data many-to-many relationship nsset

我在核心数据模型中有两个实体,如:A <<--->> B 实体B具有属性名称,该属性名称是字符串对象,并且具有AObjects与A的关系;相反,实体A有一个BObjects到B.的关系 现在我想得到一个与A实体连接的所有BObject的列表然后,我想在标签中显示它们的名字。

这可能吗?我知道CoreData不支持多对多关系...
谢谢!

2 个答案:

答案 0 :(得分:2)

我认为您可能没有完全描述您的情况,因为Core Data绝对支持多对多关系。我怀疑你可能意味着NSFetchedResultsController不支持多对多关系? 据我所知,这是正确的。编辑:可以使用具有多对多关系的NSFetchedResultsController ......如何做到这一点并不是很明显。)

要在没有NSFetchedResultsController的情况下执行此操作,请识别/获取您感兴趣的A实体,然后遍历您感兴趣的关系。因此,如果您已经知道您对我将调用的特定A对象感兴趣使用类名A和B的theAObject,您可以使用点语法和快速枚举来遍历关系,使用类似下面的内容:

for (B *theBObject in theAObject.BObjects) {
    NSLog(@"theBObject.name: %@.", theBObject.name);
    // Run whatever code you want to here on theBObject.
    // This code will run once for each B Object associated with theAObject 
    // through the BObjects relationship.
}

或者,您可以设置获取请求以获取您感兴趣的一组AObject,然后遍历每个AObject的BOjects关系。它与多对多关系没有任何区别......每个AObjecct都将返回其BObjects关系中的所有B对象。

后来 现在,您说要获取所有名称,并将其显示在标签中。让我们为你打破这个:

NSString *myLabel = null;
// You may of course want to be declaring myLabel as a property and @synthesising
// it, but for the sake of a complete example we'll declare it here which means 
// it will only have local scope.

for (B *theBObject in theAObject.BObjects) {
    myLabel = [myLabel stringByAppendingString:theBObject.name];    
    // Add a line break in the string after each B object name.
    myLabel = [myLabel stringByAppendingString:@"\n"];
}

// Do something with your myLabel string to set your desired label.

答案 1 :(得分:0)

您可以尝试这样的谓词:

NSPredicate * fetchPredicate = [NSPredicate predicateWithFormat:@“任何AObjects =%@”,[A的NSManagedObjectID]];