0

我在 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 而不是 NSObject。

4

2 回答 2

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];
...
于 2012-05-16T11:28:57.970 回答
0

根据加布里埃尔的建议:

您是否创建了数据模型?为什么你的实体子类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 文件中创建的列(我想)。您不必使用它,而只需使用数据模型中声明的属性(属性或关系)。

A 的 id、path 和 ref_foreignkey_B

B 的 id 和 name

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

另外,我建议你创建一个从Bto的反比关系A。这使您可以维护对象图中的完整性。有关信息,请阅读关系

希望能帮助到你。

于 2012-05-16T11:29:32.997 回答