核心数据不同的提取给出空数组

Posted

技术标签:

【中文标题】核心数据不同的提取给出空数组【英文标题】:Core-data distinct fetch give empty array 【发布时间】:2012-09-24 15:57:39 【问题描述】:

我花了几个小时试图让 fetch 工作。我需要删除重复项,所以我想我可以遵循本指南core-data-how-to-do-a-select-distinct 但它总是给我一个空数组。

这是我的代码:

NSFetchRequest *request = [[NSFetchRequest alloc] init];

NSEntityDescription *entity = [NSEntityDescription entityForName:@"RBTag" inManagedObjectContext:[self context]];
request.entity = entity;
request.propertiesToFetch = [NSArray arrayWithObject:[[entity propertiesByName] objectForKey:@"name"]];
request.returnsDistinctResults = YES;
request.resultType = NSDictionaryResultType;

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
[request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];


NSError *error = nil;
NSArray *distincResults = [[self context] executeFetchRequest:request error:&error];


NSLog(@"Result: %@", distincResults);

我没有错误。我检查了 NSPropertyDescription,它确实找到了我的财产。 如果我注释掉:

request.resultType = NSDictionaryResultType;

然后我得到结果,但它并不明显。 =(

【问题讨论】:

如果您注释掉returnsDistinctResults,但结果类型仍设置为NSDictionaryResultType,会发生什么情况?那么它会返回任何东西吗? 不行,还是给我一个空数组。 【参考方案1】:

任何指南或苹果文档中都没有,但经过艰苦的谷歌搜索后,我发现了这篇文章: bbarnheart 必须在将 resultType 更改为 NSDictionaryResultType 之前将上下文保存到持久存储。

【讨论】:

在 Apple 文档中,但隐藏在 setIncludesPendingChanges: 属性的文档中:“不支持 YES 值与结果类型 NSDictionaryResultType 结合使用,包括聚合结果的计算(例如如 max 和 min)。对于字典,从 fetch 返回的数组反映了持久存储中的当前状态,并且不考虑上下文中的任何未决更改、插入或删除。"【参考方案2】:

propertiesToFetch 需要一个属性名称的数组,但您将它设置为一个NSAttributeDescription 的数组。试试

request.propertiesToFetch = [NSArray arrayWithObject:@"name"];

如果您不设置request.resultType = NSDictionaryResultType;,则propertiesToFetch 将被忽略。

【讨论】:

request.propertiesToFetch = [NSArray arrayWithObject:@"name"];少了很多代码。谢谢! 这也是完全不同的东西...... ;-)

以上是关于核心数据不同的提取给出空数组的主要内容,如果未能解决你的问题,请参考以下文章

核心数据 NSSet 返回空的对象数组

核心数据打开文件脏,缺失值不一致,fetch返回空数组

Java核心知识集合

针对磁盘查找的核心数据提取性能

核心数据:非法尝试建立关系+(空)上下文

核心数据和数组 swift 2.0