在数据库中,我遇到以下情况,A
有很多B
个,而C
也有很多B
个。
使用核心数据关系搜索此类查询的有效方法是什么?
a.x
和c.y
属性B
例如:
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 = m
和a.y = a
会导致来自B = {1;6}
的以下记录吗?
答案 0 :(得分:4)
技术说明:核心数据不是关系数据库,因此实际上并没有“加入”。它更准确地描述为对象图。
实现你想要的东西应该非常简单:
使用实体A
,B
,C
设置模型。
B
与A
(此属性称为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];
答案 1 :(得分:1)
我不确定我理解你的问题,但至少我可以回答如何获取两个Core Data托管对象在某个属性中有共同点的对象。
您有两个核心数据实体A
和C
。作为所有Core Data实体,它们在运行时由NSManagedObject
实例表示。您已定义A
和C
,每个人都有一个名为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"];