【问题标题】:Retrieving a unique result set with Core Data使用 Core Data 检索唯一的结果集
【发布时间】:2011-02-09 00:26:06
【问题描述】:

我有一个基于核心数据的应用程序来管理一堆实体。我希望能够做到以下几点。

我有一个实体“SomeEntity”,具有以下属性:名称、类型、等级、foo1、foo2。

现在,如果我们严格用 SQL 术语来说,SomeEntity 有几行。我想要完成的是只检索可用的类型,即使每个实例都可以有重复的类型。我还需要根据等级按顺序返回它们。所以在 SQL 中,我正在寻找的是以下内容:

SELECT DISTINCT(type) ORDER BY rank ASC

这是我目前正在破坏的代码:

NSError *error = NULL;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setReturnsDistinctResults:YES];
[fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:@"type", @"rank", nil]];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"SomeEntity" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];

// sort by rank
NSSortDescriptor *rankDescriptor = [[NSSortDescriptor alloc] initWithKey:@"rank" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:rankDescriptor,nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[sortDescriptors release];
[rankDescriptor release];

NSArray *fetchResults = [managedObjectContext executeFetchRequest:fetchRequest error:&error];

[fetchRequest release];

return fetchResults;

现在,以下内容正在崩溃:Invalid keypath section passed to setPropertiesToFetch:

【问题讨论】:

  • 更新示例。要获取的属性出现错误
  • 如果你指定属性来获取@"type" 和@"rank",你会在两个属性上得到不同。您应该只指定 @"type" 属性

标签: iphone cocoa core-data


【解决方案1】:
NSManagedObjectContext * ctx ; /* some ctx */    
NSFetchRequest * req; /* your request */
NSEntityDescription *entity = [NSEntityDescription entityForName:@"SomeEntity" inManagedObjectContext:context];
NSDictionary *entityProperties = [entity propertiesByName];
[req setEntity:entity];
[req setReturnsDistinctResults:YES];
[req setPropertiesToFetch:[NSArray arrayWithObject:[entityProperties objectForKey:@"type"]]];
[req setSortDescriptors:[NSArray arrayWithObject:[[NSSortDescriptor alloc] initWithKey:@"rank" ascending:YES]]];
NSArray * result = [ctx executeFetchRequest:req error:nil];

【讨论】:

  • 将示例编辑为 ged ORDER BY。结果,您将收到“SomeEntity”数组,具有不同类型,按等级排序
  • 小修复。编辑要获取的属性。
  • [fetchRequest setResultType:NSDictionaryResultType];设置它,你将不会收到 SomeEntity'ies 结果,但 NSDictionary 在你的情况下只有一个获取的属性@“type”
  • 不得不使用 setResultType,但这样做了。感谢您的解决方案,效果很好!
  • 但我认为不可能通过“rank”属性对这些类型进行排序。我觉得连SQL都做不到
猜你喜欢
  • 2015-07-12
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2018-08-18
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多