【问题标题】:How should I model this data in Core Data我应该如何在 Core Data 中对这些数据进行建模
【发布时间】:2020-04-21 10:23:18
【问题描述】:

我正在尝试对以下数据进行建模,以便将其存储在 CoreData 中。

由于它使用自定义类,我不确定如何正确建模。

每个Account 都有一个id 和一个profile

struct Account {
  let id: String
  let profile: UserProfile
}

每个配置文件都有自己的 idname 以及 Post 数组

struct UserProfile {
  let id: String
  let name: String
  let posts: [Post]
}

帖子由id、一个与个人资料上的ID匹配的authorId和一个title组成

struct Post {
  let id: String
  let authorId: String // this maps to the UserProfile id field
  let title: String
}

一个帐户可以有 1 个个人资料,反之亦然。然而,一个配置文件可以有 N 个 Posts

我假设我需要 3 个实体,Account、UserProfile 和 Post。

Account 和 UserProfile 将具有一对一的关系。

我不确定如何为 UserProfile 和 Post 建模。

UserProfile 是否应该与 Post 建立一对多的关系?

是否有可能 Post 与 UserProfile 具有一对一的关系,而 UserProfile 与 Post 具有一对多的关系?

另外,我假设 CoreData 不支持 Codable,所以 profile 属性不应该作为 AttributeAccount 上存在,而是作为 Relationships 字段中的值存在?

【问题讨论】:

    标签: ios swift core-data codable


    【解决方案1】:

    我的建议:

    class Account : NSManagedObject {
      @NSManaged var id: String
      @NSManaged var profile: UserProfile?
    }
    
    class UserProfile : NSManagedObject {
      @NSManaged var id: String
      @NSManaged var name: String
      @NSManaged var account: Account?
      @NSManaged var posts: Set<Post>
    }
    
    class Post : NSManagedObject {
      @NSManaged var id: String
      @NSManaged var author: UserProfile?
      @NSManaged var title: String
    }
    
    • profile in AccountUserProfile 是一对一的关系
    • account in UserProfileAccount 是一对一的反向关系
    • posts in UserProfile 是与 Post 的一对多关系
    • author in PostUserProfile 是一对一的反向关系

    反向关系比在Post 中维护像authorId 这样的属性更有效

    可以在 Core Data 类(包括关系)中采用 Codable,但实现有点棘手。

    【讨论】:

    • 谢谢 Vadian,正如您提到的 Codable 有点棘手,最好将每个可编码模型分离到它自己的实体中,并且只使用这些模型中的基本类型,例如 StringInt 等等?而不是编码为Data 并只存储值?
    • 这取决于你的需要,有几种方法。
    • 我能问一下为什么可选的引用也可以吗?例如,在代码中,如果没有 Profile,Account 就不能存在,反之亦然。现在只是为了我自己的理解:)
    • 这些选项确实没有必要。我在核心数据关系中实现Codable 时遇到问题,因此我声明一对一关系是可选的。
    • 啊,我明白了,太棒了。感谢您的帮助。
    猜你喜欢
    • 2012-04-07
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 2011-04-13
    • 1970-01-01
    • 2018-10-26
    • 2012-07-02
    相关资源
    最近更新 更多