使用NSObject的外键的CoreData谓词

时间:2012-05-16 11:17:56

标签: iphone objective-c sql ios core-data

我在Core Data中有这样的关系:

A -> B

和以下表格:

A
----
id 
path
ref_foreignkey_B

B
----
id
name

问题是外键设置为B对象(继承自NSObject)。

然后我试图从A中获取所有条目,其中设置了对某个B对象的引用。我知道对象B,但无法弄清楚如何正确设置NSPredicate

我尝试了以下内容:

NSString *complexPredicateFormat = [NSString stringWithFormat:@"ZREF_B == %@", self.B];   
NSPredicate *filter = [NSPredicate predicateWithFormat:complexPredicateFormat];
[fetchRequest setPredicate:filter];

...但是会导致以下错误:

'NSInvalidArgumentException', reason: 'Unable to parse the format string "ZREF_B == <B: 0x89d8300> (entity: B; id: 0x89d3ca0 <x-coredata://...

有谁知道如何将NSManagedObject更新的)设置为预测过滤器(代表where子句)?

修改:  对不起。当然A和B都继承自NSManagedObject和NOT NSObject。

2 个答案:

答案 0 :(得分:0)

不确定我是否理解这个问题,但如果“ref_foreignkey_B”是从A到B的关系,那么你的谓词应如下所示:

NSFetchRequest *fetch = [NSFetchRequest alloc] init];
fetch.entity = [NSEntityDescription entityForName:@"A" inManagedObjectContext:managedObjectContext];
NSPredicate *filter = [NSPredicate predicateWithFormat:@"ref_foreignkey_B == %@", self.B];

NSError *error = nil
NSArray *array = [managedObjectContext executeRequest:fetch];
...

答案 1 :(得分:0)

基于 Gabriel 建议:

您是否创建了数据模型?为什么你的实体是NSObject的子类?

然后

如果ref_foreignkey_B是实体B的关系,则需要使用

[NSPredicate predicateWithFormat:@"ref_foreignkey_B == %@", self.B];

显然,如果您使用该谓词,则需要针对A而不是B进行查询(使用获取请求)。

NSFetchRequest* fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"A"];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"ref_foreignkey_B == %@", self.B];

一些笔记

为什么使用ZREF_B?这是在sqlite文件中创建的列(我想)。您不必使用它,只需使用数据模型中声明的属性(属性或关系)。

  

id,path和ref_foreignkey_B for A

     

B

的ID和名称

当您处理Core Data时,您处理的是对象图,而不是db(例如sqlite)本身。这是一个需要理解的重点。您有来处理为您创建的sqlite文件(例如)。仅限您创建的数据模型。

此外,我建议您创建从BA的反向关系。这使您可以在对象图中保持完整性。有关信息,请阅读Relationships

希望它有所帮助。