【问题标题】:iOS core data how to access single entity from different entitiesiOS核心数据如何从不同实体访问单个实体
【发布时间】:2014-03-11 15:56:06
【问题描述】:

我有一个这样的模型:

如何使“文件”实体可以被 Entity1 或 Entity2(或 Items)引用

基本上,我有许多带有 id 的“文件”。如果对“文件”进行了更改(例如更改了名称),那么当任何实体引用该文件时,它应该具有更新的信息......而不必在每个实体中进行更新。

有没有办法通过编辑器做到这一点?还是我必须编写代码来首先获取我正在寻找的文件 id,然后在获得文件 id 后,使用我刚刚获得的 id 对“文件”实体进行单独的请求?

在 sql 中,我可以从任何表进行左连接。如果可以在谓词中执行,那也可以,只是不确定如何。

编辑:

所以我更新了我的模型,现在它看起来像这样:

我为“文件”添加了数据,然后为 Entity1 和 Entity2 添加了数据

我有用于显示文件的代码,然后是用于显示实体的代码。 这是我正在做的事情的 sn-p:

NSEntityDescription *entityDescription = [NSEntityDescription
                                          entityForName:@"Entity1" inManagedObjectContext:context];

NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entityDescription];

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

[entityArray enumerateObjectsUsingBlock:^(Entity1 *entity1, NSUInteger idx, BOOL *stop) {
    NSLog(@"entity1: %@", entity1.name);
}];

我现在如何从文件中获取 Entity1 的“名称”?让我们假设名称字段是一个匹配字段。我需要在代码中添加什么来提取“文件”?这是假设在“Entity1”当然存在之前“文件”就在那里。

我目前正在运行另一种类似于“getFileByName:(NSString *)name”的方法,并使用谓词执行单独的请求。这行得通,但我认为有更好的方法。

【问题讨论】:

  • “以便 Entity1、Entity2 或 Items 可以引用“文件”实体是什么意思?
  • 我想如果我与 Entity1 的文件建立关系,那么我将无法从 entity2 访问相同的文件。我会尝试丹的答案,看看它是否有效。感谢您查看此内容。
  • 您的编辑完全是另一个问题。考虑将其作为一个重新发布。

标签: ios xcode core-data nspredicate


【解决方案1】:

您可以简单地为喜欢引用它们的任何其他实体创建与 Files 实体的关系(具有您想要的基数)。

请记住,虽然Files.id 是唯一的,但CoreData 提供的唯一性是objectID ==> 您可以将id 引用替换为文件objectID 并获得相同的功能。

一些建议:

  1. 不要使用id作为属性名,它是Objective-C中的保留字
  2. 不要以复数形式命名您的实体(例如Files --> File)它们是对象定义或类(不要从表的角度考虑,尽管这可能是底层结构)

【讨论】:

  • 所以我可以创建从 entity1 到文件的一对多关系,以及从 entity2 到我在 entity1 中使用的相同文件实体的一对多关系? (无论如何我都会在等待时尝试).. 感谢对象 id 提示,这里的问题是 id 是从外部来源获取的,并且可能会在某个时候更新,所以这是我返回服务器数据的链接。
  • @Amos 然后在您的代码中将它们更改为identifier。你不能使用id。这是一个保留字,给您带来麻烦。
  • @Dan 我正在尝试与“文件”实体的 one->one 关系,看看是否可行...感谢您的建议,这个例子比我实际的简单得多一起工作。有趣的是,您提出了“复数”名称问题,实际上我刚刚完成了所有实体名称的更改,然后才回来查看这篇文章,因为它在代码中“看起来”不正确。我确实有几个带有“id”的地方,所以我会改变它们。也感谢马库斯
  • 在模型编辑器中,我建立了从 entity1 到文件的一对一关系,效果很好。然后尝试从 entity2 到相同的 files 实体做同样的事情,它给了我一个警告,即 files.entity1 应该有一个逆。当我添加逆时,它会为 files.entity2 删除它,然后我会在那里收到警告。将继续,直到我能够达到我可以收集数据的地步
  • @Amos 对于每个引用 File 实体的实体,您需要一个新的关系,您不能重复使用其他实体使用的相同链接
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多