【问题标题】:iOS Core Data unique object fetchiOS Core Data 唯一对象获取
【发布时间】:2011-09-02 14:47:06
【问题描述】:

我对 iOS/Cocoa 还很陌生,我有一个关于核心数据的非常基本的问题。我在网上寻找合适的答案/解决方案,但找不到。

所以问题是您如何处理核心数据的唯一性?我知道核心数据不是数据库,它类似于对象图。假设我们有一个名为“User”的实体,它具有“id”和“name”属性以及与其他实体的一些关系。现在我们要更新特定用户的名称(例如,网络服务给了我们 id 和新名称)。

这是我之前的做法:

NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"User" inManagedObjectContext:context]];
[request setPredicate:[NSPredicate predicateWithFormat:@"id == %@", anId]];

NSError *error = nil;
NSArray *results = [context executeFetchRequest:request error:&error];
User *user = [results lastObject];

但我听说这是不好的做法。是因为带有谓词的获取请求非常慢吗?我无法想象这是一件大事。据我所知,除了遍历每个对象并检查是否相等之外,没有其他方法可以获取唯一对象。

获取实体的所有对象,将它们放入一个数组并手动循环遍历它(而不是获取请求)会更有效吗?

NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"User" inManagedObjectContext:context]];

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

User *resultUser;

for(User *user in results){
    if([user.id isEqual:anId]) resultUser = user;
}

请帮助我找到正确的路径,谢谢。

【问题讨论】:

    标签: ios cocoa core-data unique


    【解决方案1】:

    如果您有要获取的属性的索引(模型编辑器中有一个复选框),那么使用相等谓词进行获取肯定会更有效。实际上,获取所有对象并在内存中对其进行迭代从未如此高效,但索引使差异更加显着。

    【讨论】:

      【解决方案2】:

      您获取的不是唯一对象,而是包含概念上唯一属性值的对象。

      所有托管对象都是唯一的实例,但 Core Data 中没有强制要求属性值是唯一的。原则上,您可以拥有任意数量的唯一托管对象,它们都具有相同的属性值。只有关系在对象图中强制执行唯一位置。

      如果您的应用需要,没有特殊理由不获取包含特定值的特定对象。

      我认为您阅读的内容是警告不要尝试将类似 SQL 的键值塞入实体中,然后尝试使用谓词将托管对象与这些键链接在一起,例如执行以下操作:

      EntityOne{
        sqlKey:string
      }
      
      EntityTwo{
        sqlKey:string
      }
      

      ...然后尝试将两个实体的对象与谓词相关联。

         (anEntityOneObject.)sqlKey == anEntityTwoObject.sqlKey
      

      … 而不是仅仅在数据模型中设置关系。

      EntityOne{
        two<-->EntityTwo.entityOne
      }
      
      EntityTwo{
        one<-->EntityOne.two
      }
      

      ... 只需找到带有AnEntityOneObj.two 的相关对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-05
        • 1970-01-01
        • 1970-01-01
        • 2018-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多