• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - 获取过滤后的数据,再次过滤Coredata中的数据

[复制链接]
菜鸟教程小白 发表于 2022-12-13 13:36:27 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在处理核心数据。我有一个实体“目录”,它或多或少有 20 个属性。我正在获取数据并针对catalogId使用谓词,它是实体中的属性。在接收到的数据中,所有实体数据但有重复数据,我必须避免它们。我也用过这个

NSManagedObjectContext *context = [(CategoriesAppDelegate*)[UIApplication sharedApplication].delegate managedObjectContext];
NSFetchRequest* fetch = [NSFetchRequest fetchRequestWithEntityName"Tbl_catalogPage"];
NSEntityDescription* entity = [NSEntityDescription entityForName"Tbl_catalogPage"inManagedObjectContext:context];
[fetch setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat"catalogid == '%@'", catalogId]];
[fetch setPredicate:predicate];
[fetch setPropertiesToFetch:[NSArray arrayWithObjects:[[entity attributesByName]objectForKey"pageid"], [[entity attributesByName]objectForKey"catalogid"], nil]];
[fetch setResultType:NSDictionaryResultType];
[fetch setReturnsDistinctResults : YES];
NSError* error = nil;
self.resultPageArray = [context executeFetchRequest:fetch error:&error];
NSLog(@"result array count %lu",(unsigned long)self.resultPageArray.count);
NSLog (@"names: %@",self.resultPageArray);
NSLog(@"result array values ");

return resultPageArray;

但它没有用。在 Catalog 实体中,有一个 pageId 属性,在整个实体中重复出现。我想要使​​用catalogId的数据,其中应该跳过具有相同pageId的行,我的意思是避免在获取的数据中重复pageId.. 提前致谢



Best Answer-推荐答案


以下使用两步过程。使用两次提取的原因是:要为每个 pageid 选择一个对象,我们必须使用 propertiesToGroupBy,这 a) 意味着我们必须使用 NSDictionaryResultType 和 b) 意味着我们无法获取除 propertiesToGroupBy 中指定的属性以外的任何属性(正如您在之前的一个问题中发现的那样)。这两个步骤是:

  1. 获取 NSManagedObjectID,按 pageid 分组。 (虽然不能指定其他属性,但可以指定objectID。注意CoreData会任意为每个挑选一个对象pageid,并使用其 objectID。)
  2. 使用 (1) 返回的 objectID 获取 NSManagedObjects。

以上代码:

NSManagedObjectContext *context = [(CategoriesAppDelegate*)[UIApplication sharedApplication].delegate managedObjectContext];
// First fetch
NSFetchRequest *fetch = [NSFetchRequest fetchRequestWithEntityName"Tbl_catalogPage"];
// fetch only object IDs
NSExpressionDescription *objIdED = [NSExpressionDescription new];
objIdED.expression = [NSExpression expressionForEvaluatedObject];
objIdED.name = @"objId";
objIdED.expressionResultType = NSObjectIDAttributeType;
[fetch setPropertiesToFetch[objIdED]];
// Group by "pageid"
[fetch setPropertiesToGroupBy[@"pageid"]];
// Dictionary result type required for Group By:
[fetch setResultType:NSDictionaryResultType];
NSError* error = nil;
NSArray *interimResults = [context executeFetchRequest:fetch error:&error];
// Convert the array of dictionaries into an array of NSManagedObjectIDs
NSArray *requiredObjectIDs = [interimResults valueForKey"objId"];
// Second fetch
NSFetchRequest *secondFetch = [NSFetchRequest fetchRequestWithEntityName"Tbl_catalogPage"];
// Fetch only the objects with the required objectIDs
secondFetch.predicate = [NSPredicate predicateWithFormat:@"SELF IN %@", requiredObjectIDs];
self.resultPageArray = [context executeFetchRequest:secondFetch error:&error];
NSLog(@"result array count %lu",(unsigned long)self.resultPageArray.count);
NSLog (@"names: %@",self.resultPageArray);
NSLog(@"result array values ");

(为简洁起见省略了错误检查)。

关于ios - 获取过滤后的数据,再次过滤Coredata中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34759379/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap