核心数据:三个或更多表连接

时间:2011-11-23 10:56:14

标签: iphone objective-c core-data

在数据库中,我遇到以下情况,A有很多B个,而C也有很多B个。 使用核心数据关系搜索此类查询的有效方法是什么?

  1. 我需要搜索a.xc.y属性
  2. 然后我需要那两个共同的B
  3. 例如:

    records are separated by colon (";"), and attributes by comma (",")

    A = {a;b}
    C = {m;n}
    B = {1,a,m;2,a,n;3,a,n;4,b,m;5,b,m;6,a,m;7,b,n;8,b,n}
    

    查询c.x = ma.y = a会导致来自B = {1;6}的以下记录吗?

2 个答案:

答案 0 :(得分:4)

技术说明:核心数据不是关系数据库,因此实际上并没有“加入”。它更准确地描述为对象图。

实现你想要的东西应该非常简单:

使用实体ABC设置模型。

BA(此属性称为a)之间存在'to-many'关系,与C之间存在'to-many'关系(此属性叫c)。

根据需要使用数据填充此模型。

然后要获得“加入”,请使用谓词进行搜索,如下所示:

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

NSEntityDescription *entity = [NSEntityDescription entityForName:@"B" inManagedObjectContext:del.managedObjectContext];
[fetchRequest setEntity:entity];

NSString* predicateString = [NSString stringWithFormat:@"a.x = %@ AND b.y = %@", 
                        @"something1", @"something2"];

fetchRequest.predicate = [NSPredicate predicateWithFormat:predicateString];

NSError *error = nil;
NSArray* objects = [del.managedObjectContext executeFetchRequest:fetchRequest error:&error];

另见iPhone CoreData join

答案 1 :(得分:1)

我不确定我理解你的问题,但至少我可以回答如何获取两个Core Data托管对象在某个属性中有共同点的对象。

您有两个核心数据实体AC。作为所有Core Data实体,它们在运行时由NSManagedObject实例表示。您已定义AC,每个人都有一个名为B的关系,即一对多或多对多关系。换句话说,每个A对象可以包含多个B个对象,因此可以C

为了使这更容易,我将为这些类提出其他名称:

Dessert <<---->> Ingredient
MainDish <<---->> Ingredient

假设这种关系称为ingredients。然后你可以用

获得甜点的所有成分
NSSet* dessertIngredients = [myDessert valueForKey:@"ingredients"];

同样可以获得主菜的配料:

NSSet* mainDishIngredients = [myMainDish valueForKey:@"ingredients"];

要获得两个集合的交集,您需要使用可变集合对象:

NSMutableSet* commonIngredients = [NSMutableSet setWithSet:dessertIngredients];
[commonIngredients intersectSet:mainDishIngredients];

获得相同结果的另一种方法是使用Cocoa的KVC collection operator @distinctUnionOfArrays

NSArray* objectsWithIngredients = [NSArray arrayWithObjects:myMainDish, myDessert, anotherMainDish, nil];
NSSet* uniqueIngredients = [anotherMainDish valueForKeyPath:@"@distinctUnionOfArrays.ingredients"];