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

ios - 显示核心数据 : If attribute has same name display once

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

我查看了许多谓词问题,我阅读了文档,但似乎没有什么可以作为我的问题的答案。

我有一个名为 Materials 的核心数据实体,我有属性 categorysubcategorydescription

我有三个 UITableViewControllers 并且在每个中我想使用一个谓词来显示如下:

TableViewController 1:只有类别(类别名称不重复)

选择一个类别并转到 TableViewController 2。

TableViewController 2:显示子类别(不重复子类别名称)

选择一个子类别并转到 TableViewController 3 列出该类别和子类别中的所有项目。

如果不在核心数据模型中使用三个实体,我可以这样做吗?

我尝试在我的 fetchedResultsController 方法中使用以下谓词代码,但成功了:

Materials * materials = [[Materials alloc]init];//this doesn't feel like it belongs inside a fetchedResultsController

NSPredicate * predicate = [NSPredicate predicateWithFormat"category == %@", materials.category];

fetchRequest.predicate = predicate;

这是我第一次尝试以这种方式排序和显示,我通常会按照惯例使用关系谓词,但为一组数据( Material )设置 3 个实体似乎不合逻辑。



Best Answer-推荐答案


您不需要为每个 Material 、类别和子类别设置三个不同的 NSMO。您只需要一个 NSMO,它是具有这些属性类别、子类别和描述的 Material 。

在 ViewController 1 中显示类别:

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName"Materials"];
NSEntityDescription *entity = [NSEntityDescription entityForName"Materials" inManagedObjectContext:self.managedObjectContext];

// Required! Unless you set the resultType to NSDictionaryResultType, distinct can't work. 
// All objects in the backing store are implicitly distinct, but two dictionaries can be duplicates.
// Since you only want distinct Categories, only ask for the 'Category' property.
fetchRequest.resultType = NSDictionaryResultType;
fetchRequest.propertiesToFetch = [NSArray arrayWithObject:[[entity propertiesByName] objectForKey"Category"]];
fetchRequest.returnsDistinctResults = YES;

// Now it should yield an NSArray of distinct values in dictionaries.
NSArray *dictionaries = [self.managedObjectContext executeFetchRequest:fetchRequest error:nil];
NSLog (@"names: %@",dictionaries);

通过它,您可以从核心数据中获取具有不同类别的所有 Material NSManagedObject。

用于在 ViewController 2 中显示子类别:

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName"Materials"];
NSEntityDescription *entity = [NSEntityDescription entityForName"Materials" inManagedObjectContext:self.managedObjectContext];


NSPredicate * predicate = [NSPredicate predicateWithFormat"SELF.category == %@", selectedCategoryName];

fetchRequest.predicate = predicate;
// Required! Unless you set the resultType to NSDictionaryResultType, distinct can't work. 
// All objects in the backing store are implicitly distinct, but two dictionaries can be duplicates.
// Since you only want distinct SubCategory, only ask for the 'SubCategory' property.
fetchRequest.resultType = NSDictionaryResultType;
fetchRequest.propertiesToFetch = [NSArray arrayWithObject:[[entity propertiesByName] objectForKey"SubCategory"]];
fetchRequest.returnsDistinctResults = YES;

// Now it should yield an NSArray of distinct values in dictionaries.
NSArray *dictionaries = [self.managedObjectContext executeFetchRequest:fetchRequest error:nil];
NSLog (@"names: %@",dictionaries);

通过它,您可以从核心数据中获取具有不同类别的所有 Material NSManagedObject。

让第三个 Viewcontroller 列出属于 Selected 类别和子类别的所有项目:

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName"Materials"];
NSEntityDescription *entity = [NSEntityDescription entityForName"Materials" inManagedObjectContext:self.managedObjectContext];


NSPredicate * predicate = [NSPredicate predicateWithFormat:@"SELF.category == %@ and SELF.subcategory == %@", selectedCategoryName,selectedSubcatgory];

fetchRequest.predicate = predicate;
// Required! Unless you set the resultType to NSDictionaryResultType, distinct can't work. 
// All objects in the backing store are implicitly distinct, but two dictionaries can be duplicates.

// Now it should yield an NSArray of distinct values in dictionaries.
NSArray *dictionaries = [self.managedObjectContext executeFetchRequest:fetchRequest error:nil];
NSLog (@"names: %@",dictionaries);

关于ios - 显示核心数据 : If attribute has same name display once,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27538930/

回复

使用道具 举报

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

本版积分规则

关注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