繁体   English   中英

iOS Core Data唯一对象获取

[英]iOS Core Data unique object fetch

我是iOS / Cocoa的新手,我对核心数据有一个非常基本的问题。 我一直在互联网上寻找合适的答案/解决方案,但我没有能力。

那么问题是如何处理核心数据的唯一性? 我知道核心数据不是数据库,而是类似对象图的数据库。 假设我们有一个名为“用户”的实体,其属性为“ id”和“名称”,并且与其他实体有一些关系。 现在,我们要更新特定用户的名称(例如,Web服务为我们提供了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;
}

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

如果您要获取的属性有一个索引(模型编辑器中有一个复选框),则使用等式谓词进行获取肯定会效率更高。 实际上,获取所有对象并在内存中对其进行迭代从未如此高效,但是索引使两者之间的区别更加明显。

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

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

如果这是您的应用程序所需要的,则没有特别的理由不获取包含特定值的特定对象。

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

EntityOne{
  sqlKey:string
}

EntityTwo{
  sqlKey:string
}

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

   (anEntityOneObject.)sqlKey == anEntityTwoObject.sqlKey

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

EntityOne{
  two<-->EntityTwo.entityOne
}

EntityTwo{
  one<-->EntityOne.two
}

…并仅通过AnEntityOneObj.two查找相关对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM