iOS 关系中的核心数据谓词
iOS coredata predicate within relationships
我有一个 table 喜欢:
POI(= 兴趣点)--> belongsToCategory --> POICategory
现在我基本上想要这样的查询:
"Give me all POIs which belong to category x, y, z...."
我查询的类别数量当然可以是任何东西。所以我的问题是:
- 如何查询无限量的谓词?
- 我想将查询存储在用户默认值中(如果可能)。但是,我应该在什么基础上构建查询呢?我想直接在托管对象上执行此操作,但我想这行不通。而且名称也不安全,因为类别名称可以更改
- 如何将此谓词存储在用户默认值中?
我认为最好在 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
)。
我有一个 table 喜欢:
POI(= 兴趣点)--> belongsToCategory --> POICategory
现在我基本上想要这样的查询: "Give me all POIs which belong to category x, y, z...." 我查询的类别数量当然可以是任何东西。所以我的问题是:
- 如何查询无限量的谓词?
- 我想将查询存储在用户默认值中(如果可能)。但是,我应该在什么基础上构建查询呢?我想直接在托管对象上执行此操作,但我想这行不通。而且名称也不安全,因为类别名称可以更改
- 如何将此谓词存储在用户默认值中?
我认为最好在 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
)。