核心数据获取唯一属性

时间:2014-07-07 11:35:14

标签: ios iphone objective-c core-data nsfetchedresultscontroller

我有一个名为Item的核心数据对象,它有2个属性identifiertype

Item
----

identifier 
type (A/B)

可以有2个具有相同标识但具有不同类型的项目。

我需要用一个条件获取所有项目:
如果两个项目具有相同的标识符,则仅显示A类型。

换句话说,我想确保所提取的项目具有唯一标识符,并且在具有相同标识符的多个项目的情况下,将优先考虑具有类型A的项目。

如果可能的话,我也不想使用NSDictionaryResultType

1 个答案:

答案 0 :(得分:1)

您可以使用谓词从核心数据中获取,以查找(或计算)具有identifier的对象(顺便说一下 NOT 使用id,它是一个保留字Cocoa)并且您可以按其他属性排序,然后您可以将获取结果限制为单个项目。

这将为您提供所需的优先权。但是,我强烈建议不要以这种方式处理问题,而是编写创建代码以避免首先出现重复。

更新

我所说的是无法“以一个条件获取所有项目......”。您可以做的是获取每个项目(使用标识符),将获取限制为按type排序的单个结果,这将为您提供结果。< / p>

如果你想要所有类型为“a”的项目,那就是可行的。

如果你想在内存中第二次传递所有项目并过滤类型,那么你可以这样做

你无法将它们组合起来。

现在,如果你想获取每个项目,过滤类型,它将如下所示:

NSManagedObjectContext *moc = ...;
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"MyEntity"];
[fetchRequest setFetchLimit:1];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"identifier == %@", myIdentifier];

NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"type" ascending:YES];
NSArray *sortArray = [NSArray arrayWithObject:sort];
[fetchRequest setSortDescriptors:sortArray];

NSError *error = nil;
NSArray *results = [moc executeFetchRequest:fetchRequest error:&error];
if (!results) {
  NSLog(@"Error: %@\n%@", [error localizedDescription], [error userInfo]);
  abort();
}

id mySingleObject = [results lastObject];

注意:此代码是在浏览器中编写的,可能存在错误。