关系中的iOS核心数据谓词

时间:2015-03-09 15:03:23

标签: ios objective-c core-data

我有一张表:

POI(=兴趣点) - > belongsToCategory - > POICategory

现在我基本上想要一个查询: "给我所有属于x,y,z ......类别的POI。" 我查询的类别数当然可以是任何东西。所以我的问题是:

  1. 如何查询无限量的谓词?
  2. 我想将查询(如果可能)存储在用户默认值中。但是我应该在什么时候构建查询呢?我想直接在托管对象上进行,但我想这不会起作用。并且名称也不安全,因为类别名称可以更改
  3. 如何将此谓词存储在用户默认值中?

2 个答案:

答案 0 :(得分:1)

我认为POI是一个实体,其关系名为belongsToCategory,其中POICategory为其目标实体。你不会说这种关系是一对一还是多对(谓语在每种情况下略有不同)。如果你有一个数组requiredCategories包含你感兴趣的POICategory个对象(x,y,z等),那么你可以在谓词中使用IN运算符,就像这样:

对于一对一:

NSFetchRequest *fetch = [NSFetchRequest fetchRequestWithEntityName:@"POI"];
fetch.predicate = [NSPredicate predicateWithFormat:@"belongsToCategory IN %@",requiredCategories];
NSError *error = nil;
[context executeFetchRequest:fetch error:&error];
... etc

对于多人来说:

NSFetchRequest *fetch = [NSFetchRequest fetchRequestWithEntityName:@"POI"];
fetch.predicate = [NSPredicate predicateWithFormat:@"ANY belongsToCategory IN %@",requiredCategories];
NSError *error = nil;
[context executeFetchRequest:fetch error:&error];
... etc

IN运算符避免了必须为每个类别的单独谓词构建复合谓词。

关于在NSUserDefaults中存储查询,我想你想要保留所需类别(x,y,z等)的详细信息,以便随后可以重建查询。它可以做到,但我的建议是:不要。在NSManagedObjects中保留NSUserDefaults的详细信息是圆孔中的方形挂钩。最好设计CoreData实体,以便跟踪选择的类别(例如,向selected添加POICategory属性)。

答案 1 :(得分:0)

我认为最好在POICategory表中使用您需要的所有类别的谓词进行查询,然后阅读POI集,只需访问poiCategory.poiArray

我还建议在NSPredicate上创建一个类别来构造你需要的谓词。如果需要更改,保存在userdefaults中会强制您保留它