Iphone 核心数据:三个或更多的表联接
在数据库中,我有以下情况,Iphone 核心数据:三个或更多的表联接,iphone,objective-c,core-data,Iphone,Objective C,Core Data,在数据库中,我有以下情况,a有许多B,而C也有许多B。 使用核心数据关系搜索此类查询的有效方法是什么 我需要搜索a.x和c.y属性 然后我需要那些对两者都通用的B 例如: 记录用冒号(;)分隔,属性用逗号(,)分隔 查询c.x=m和a.y=a是否会导致B={1;6}中的以下记录?我不确定我是否理解您的问题,但至少我可以回答如何获取两个核心数据管理对象在某个属性中具有共同点的对象 您有两个核心数据实体,A和C。作为所有核心数据实体,它们在运行时由NSManagedObject实例表示。您已将A和C
a
有许多B
,而C
也有许多B
。
使用核心数据关系搜索此类查询的有效方法是什么
a.x
和c.y
属性B
记录用冒号(;)分隔,属性用逗号(,)分隔
查询
c.x=m
和a.y=a
是否会导致B={1;6}
中的以下记录?我不确定我是否理解您的问题,但至少我可以回答如何获取两个核心数据管理对象在某个属性中具有共同点的对象
您有两个核心数据实体,A
和C
。作为所有核心数据实体,它们在运行时由NSManagedObject
实例表示。您已将A
和C
定义为每个都有一个名为B
的关系,即一对多或多对多。换句话说,每个A
对象可以有许多B
对象,C
也可以
为了让这更简单,我将为这些类提供其他名称:
Dessert <<---->> Ingredient
MainDish <<---->> Ingredient
同样,主菜的配料如下:
NSSet* mainDishIngredients = [myMainDish valueForKey:@"ingredients"];
要获得两个集合的交集,需要使用可变集合对象:
NSMutableSet* commonIngredients = [NSMutableSet setWithSet:dessertIngredients];
[commonIngredients intersectSet:mainDishIngredients];
获得相同结果的另一种方法是使用Cocoa的@distinctunionofarray
:
NSArray* objectsWithIngredients = [NSArray arrayWithObjects:myMainDish, myDessert, anotherMainDish, nil];
NSSet* uniqueIngredients = [anotherMainDish valueForKeyPath:@"@distinctUnionOfArrays.ingredients"];
我不确定我是否理解您的问题,但至少我可以回答如何获取两个核心数据管理对象在某个属性中具有共同点的对象 您有两个核心数据实体,
A
和C
。作为所有核心数据实体,它们在运行时由NSManagedObject
实例表示。您已将A
和C
定义为每个都有一个名为B
的关系,即一对多或多对多。换句话说,每个A
对象可以有许多B
对象,C
也可以
为了让这更简单,我将为这些类提供其他名称:
Dessert <<---->> Ingredient
MainDish <<---->> Ingredient
同样,主菜的配料如下:
NSSet* mainDishIngredients = [myMainDish valueForKey:@"ingredients"];
要获得两个集合的交集,需要使用可变集合对象:
NSMutableSet* commonIngredients = [NSMutableSet setWithSet:dessertIngredients];
[commonIngredients intersectSet:mainDishIngredients];
获得相同结果的另一种方法是使用Cocoa的@distinctunionofarray
:
NSArray* objectsWithIngredients = [NSArray arrayWithObjects:myMainDish, myDessert, anotherMainDish, nil];
NSSet* uniqueIngredients = [anotherMainDish valueForKeyPath:@"@distinctUnionOfArrays.ingredients"];
技术说明:核心数据不是关系数据库,因此没有真正的“连接”。它更准确地描述为对象图 实现您想要的应该非常简单: 使用实体
a
、B
、C
设置模型
B
与a
(此属性称为a
)存在“对多”关系,与C
(此属性称为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];
另请参见。技术说明:核心数据不是关系数据库,因此没有真正的“连接”。它更准确地描述为对象图 实现您想要的应该非常简单: 使用实体
a
、B
、C
设置模型
B
与a
(此属性称为a
)存在“对多”关系,与C
(此属性称为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];
另请参见。为什么不使用包含“AND”的谓词,让核心数据完成繁重的工作?那就没有必要在设定的交叉路口乱来了。你说得对。我只是部分地理解了这个问题,并没有考虑使用反正关系,这显然是更好的。嘿,谢谢你的回答,你的方法也很好,而且容易理解,但是我认为用核心数据进行谓词搜索会更有效。嘿,COCONANOOB,你能考虑接受我的答案吗?如果你认为这是最好的答案?@cocoaNoob:为了其他用户的利益,请接受你认为是最好的答案,正如occulus所说。在这种情况下,我想我们都同意这是他的答案。为什么不使用一个包含“AND”的谓词,让核心数据完成繁重的工作呢?那就没有必要在设定的交叉路口乱来了。你说得对。我只是部分地理解了这个问题,并没有考虑使用反正关系,这显然是更好的。嘿,谢谢你的回答,你的方法也很好,而且容易理解,但是我认为用核心数据进行谓词搜索会更有效。嘿,COCONANOOB,你能考虑接受我的答案吗?如果你认为这是最好的答案?@cocoaNoob:为了其他用户的利益,请接受你认为是最好的答案,正如occulus所说。在这种情况下,我想我们都同意这是他的答案。谢谢,这很有魅力。我认为应该有一个适当的指南来帮助像我这样的人从数据库移动到核心数据,因为在核心数据中,所有的都是关于对象的,我的问题是我一直在考虑连接。如果你知道关于它的任何好的资源,那么请让我知道cooanoob,这篇文章是一个很好的比较:也包括谷歌的“核心数据与关系数据库”之类的东西。如果你觉得答案是最好的,你能考虑接受我的回答吗?谢谢,它的工作很有魅力。我认为应该有一个适当的指南来帮助像我这样的人从数据库移动到核心数据,因为在核心数据中,所有的都是关于对象的,我的问题是我一直在考虑连接。如果你知道任何关于它的好资源,那么p