【问题标题】:How do I set up my Core Data model when my objects have arbitrary property data?当我的对象具有任意属性数据时,如何设置我的核心数据模型?
【发布时间】:2016-11-15 04:40:37
【问题描述】:

我正在努力弄清楚如何构建一个核心数据模型来支持我在我的应用中创建的类结构。

我的应用有用户,我允许这些用户使用多种不同的身份验证方法登录应用。每种身份验证方法都需要稍微不同的凭据和凭据类型。我选择通过创建一个抽象的AuthenticationSettings 基类来解决这个问题,然后使用FacebookAuthenticationSettingsTwitterAuthenticationSettingsMyWebsiteAuthenticationSettings 等对其进行子类化。

我的User 类有一个属性authSettingsAuthenticationSettings 类型),它存储一个设置类的实例。每个用户只能使用一种身份验证方法,因此效果很好。

问题是,鉴于authSettings 可以存储多种对象类型之一,我该如何为我的用户创建核心数据模型?

  • 是否为每种类型的身份验证创建单独的实体,然后在这些实体和用户实体之间创建关系?这很奇怪,因为数据模型不会对用户强制执行 1:1 的身份验证方法。在获取用户时,我还必须获取他们相应的身份验证方法。

  • 我是否只是创建自己的身份验证凭据的序列化编码并将其塞入用户实体的字符串字段中?这迫使我发明一些编码,如果任何未来的身份验证方法使用难以序列化为字符串的字段,这种编码会感觉特别混乱。

  • 有没有更好的办法?

【问题讨论】:

    标签: objective-c database core-data data-modeling foundation


    【解决方案1】:

    一种方法是设置与您的类层次结构平行的 Core Data 实体层次结构。在 Core Data 中创建一个名为 AuthenticationSettings 的抽象实体,并为每种身份验证类型创建一系列子实体。与您的 User 类属性一样,创建与 AuthenticationSettings 的关系。

    一个听起来可以满足您需求的更简单的方法是让您的各种身份验证类符合NSCoding,然后将它们存储在用户实体上的单个“可转换”(不是字符串)字段中。然后,Core Data 会自动将身份验证对象转换为NSData

    【讨论】:

    • 完美!我不知道 Transformable 类型。
    • 在这种情况下,我会远离可变形对象。这些适用于自定义数据类型,例如位置(坐标对)或其他一些非基于类的结构。如果身份验证方法被建模为不同的对象类型,则应在 Core Data 中进行镜像。
    • @Avi 不知道你在做什么。这正是可变形对象设计的确切情况。可转换属性仅适用于符合NSCoding 的对象,因此“非基于类”没有意义。
    • 我们必须请苹果工程师知道谁是正确的意图,但我不同意。可转换对象用于编码CGRectCGSize。不是类的结构。 Apple 的示例应用程序对图像进行编码。我认为任何被建模为对象的东西都应该以这种方式反映在 Core Data 中。请记住,Core Data 是一个对象图持久层。如果你有一个对象图作为你的内存模型,你应该按原样保存它,或者在 Core Data 允许的范围内尽可能接近它。
    • 我很想看看你如何让CGRect 符合NSCoding
    猜你喜欢
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多