iOS 关系中的核心数据谓词

iOS coredata predicate within relationships

我有一个 table 喜欢:

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

现在我基本上想要这样的查询: "Give me all POIs which belong to category x, y, z...." 我查询的类别数量当然可以是任何东西。所以我的问题是:

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

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

即可读取 POI 集

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

我假设 POI 是一个实体,它有一个名为 belongsToCategory 的关系,POICategory 作为它的目标实体。您不会说这种关系是一对一还是对多(每种情况下的谓词略有不同)。如果您有一个包含您感兴趣的 POICategory 对象(x、y、z 等)的数组 requiredCategories,那么您可以在谓词中使用 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 等)的详细信息,以便您可以在以后的某个时间重建查询。可以做到,但我的建议是:不要。在NSUserDefaults中保留NSManagedObjects的细节是圆孔中的方钉。最好以跟踪已选择的类别的方式设计您的 CoreData 实体(例如,将 selected 属性添加到 POICategory)。