【问题标题】:Core Data fetch unique property核心数据获取唯一属性
【发布时间】:2014-07-07 11:35:13
【问题描述】:

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

Item
----

identifier 
type (A/B)

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

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

也就是说我想确保获取的item会有一个唯一的标识符,并且在多个item具有相同标识符的情况下,将优先考虑type A的item。

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

【问题讨论】:

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


    【解决方案1】:

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

    这将为您提供您正在寻找的优先级。但是,我强烈建议不要以这种方式处理问题,而是编写您的创建代码以避免一开始就出现重复。

    更新

    我的意思是你不能“获取所有具有一个条件的项目......”。您可以做的是获取每个项目(使用标识符),将获取限制为按type 排序的单个结果,这将为您提供结果。

    如果您想要所有类型为“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];
    

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

    【讨论】:

    • 抱歉,我不明白您的解决方案,将我的提取限制为单个项目?但我想要所有项目,只删除重复项。我不确定我知道该怎么做你所说的所有事情,你能举个例子吗?
    猜你喜欢
    • 2018-01-27
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多