通过具有自定义字段的表,核心数据可以多对多

时间:2016-06-17 18:40:57

标签: ios swift core-data

我的对象模型有文章和媒体,其中文章以多对多的关系引用媒体。媒体可能有不同的排序,需要存储该媒体相对于文章的顺序,即e,而不是媒体本身。

核心数据在内部生成一个带有直通表的sqlite数据库:

article_id, media_id

Core Data / MagicalRecord对象是文章和媒体:

class Article: NSManagedObject {
  ...
  @NSManaged var media: NSSet
}

class Media: NSManagedObject {
  ...
}

核心数据中是否有一种方法可以在直通表机制中保持媒体的顺序?相反,每当媒体被文章使用时,我似乎需要创建一个具有自己位置的新媒体记录。

在Django和Rails中,我在模型中使用了一个直通表来存储一个位置/顺序整数,该整数表示本文的这个媒体是按此顺序排列的。该表将包含以下列:

article_id, media_id, position

在核心数据中似乎无法通过自定义字段表来填写?

1 个答案:

答案 0 :(得分:2)

我会删除多对多的关系,而是创建第三个实体,比如Reference,它实现了与你的"通过表"相同的目的。建立从ArticleReference,从MediaReference的一对多关系,并添加position属性:

enter image description here

这几乎完全反映了您的Django / Rails解决方案,但它确实要求您维护position的{​​{1}}属性 - 如果您从文章中删除引用,则需要更新{ {1}}文章中任何剩余引用的属性。

<强>或者,...

另一个解决方案是保持多对多关系,但要在数据模型中指定从Article到Media的关系是有序的:

enter image description here

如果检查基础SQLite文件,您会发现它创建了一个带有附加属性的中间表来存储订单。您无法直接访问此值,CoreData会在您向文章的References关系中插入和删除对象时对其进行更新。