【问题标题】:Core Data: Handling multiple profiles that can customize a prepopulated, static sql db?核心数据:处理可以自定义预填充的静态 sql 数据库的多个配置文件?
【发布时间】:2014-03-30 07:28:40
【问题描述】:

假设我有一个应用程序,允许您在核心数据中创建一个简单的配置文件,该配置文件将具有不同的用户属性,如姓名、性别、年龄等。这个实体 Profile 已创建并保存。深入了解配置文件后,会显示汽车的表格视图,其中包含从导入的 sql 数据库生成的数据,该数据库是使用实用程序应用程序创建的,该实用程序应用程序使用核心数据模型预填充数据。每个Car也有不同的属性,比如品牌、型号、年份、颜色等。

假设我希望能够单击此 tableview 中的每辆汽车并选择该字段。这样做时,我希望将变量 isSelected 设置为 1 以跟踪用户选择了此数据库中的哪些汽车。

到目前为止,使用具有一对多关系的单个 Profile 很容易做到这一点:Profile <-->> Car

问题
我遇到的问题是使用 多个 个人资料进行上述操作。
模型设置为Profile <<-->> Car - 使用多个配置文件,我无法弄清楚如何使导入的 sql 数据库保持静态(因为这是每个新配置文件将开始使用的基本数据),然后有另一个数据库或实体或其他我没有想到的东西每个Car 都有isSelected = 1 or 0 属性。

起初我以为我可以通过这样做为每个 Car 创建一个副本:

Profile *_currentProfile;
for (loop through all cars in the db) {
  Car *copiedCar = [NSEntityDescription insertNewObjectForEntityForName:@"Car" inManagedObjectContext:self.appDelegate.managedObjectContext];
  copiedCar.make = originalCar.make;
  copiedCar.model = originalCar.model;
  ...
  [_currentProfile addCarObject:copiedCar];
}

我认为这将允许我创建每个Car 的副本并将其放入当前的Profile 并修改isSelected 属性而不影响原始数据库。然后,这可以允许制作更多的配置文件,而不会相互干扰。当其他配置文件开始对Cars 执行提取请求时,就会出现问题。来自后续配置文件的获取请求会生成 2x、3x、..,可用 Cars 的数量取决于创建的配置文件的数量,因为每个创建的配置文件本质上都会生成另一个完整的 Cars 列表

问题 所以我的模型比上面的这个 Car 例子复杂一点,但想法是一样的.. 我应该如何构建 Core Data 模型以允许多个配置文件自定义现有的核心数据 sql 数据库,而不需要多个自定义干扰每个轮廓?在此将没有注销/登录功能。配置文件将显示在主屏幕上,您只需选择要输入的配置文件。我应该:

  1. 为每个创建的配置文件有单独的 sql 数据库吗?
  2. 这样的核心数据结构是否可以工作:Profile <<-->> Car <-->> CustomCustom 实体中使用isSelected 属性?
  3. 其他一些我没有想到的...

我尝试做前两个,但我只是做的不对,让自己很困惑。

【问题讨论】:

  • 所以你可能会在未来的更新中替换预装的汽车?连接到个人资料的汽车意味着它已被选中?
  • 两者都是。预装的汽车数据库将来可能会更新。我希望选定的汽车与各种配置文件相关联,而不更改原始数据库。

标签: ios sql core-data


【解决方案1】:

如果您的汽车与配置文件有关系,那么使用这些关系会更改原始数据 - 因此您不能只是替换它(尽管您可以对数据运行更新)。

如果您想保持源数据的原始状态,以便您可以删除所有汽车并用其他数据替换它们,那么您需要为每个汽车指定一个唯一标识符,然后使用标识符列表更新配置文件。但是,对汽车的任何更新仍然需要它们保留相同的标识符。

因此,所有汽车都应该有一个唯一标识符,并且您应该使用多对多关系。而且您应该摆脱任何isSelected 标志(因为关系体现了该信息)。唯一标识符允许您在未来更新汽车,而不用担心它们与配置文件有关系。

如果您的真正问题是每个配置文件都想更改它所连接的汽车实例,那么您应该创建一个与汽车和配置文件实体有关系的新实体(并且可以替换汽车和配置文件实体之间的直接关系)轮廓)。该实体拥有添加或覆盖汽车属性的属性。这个新实体只能与一辆车和一个配置文件相关联,并且两者都应该是必需的。汽车和个人资料都有这个新实体的许多实例。

【讨论】:

  • 谢谢 Wain,我对核心数据还是有点陌生​​,所以让我试着理解你的建议。我觉得你的第二个建议是我想要的,但对我来说实施起来似乎更令人困惑:1.唯一标识符方法 - 所以你会像我在上面的示例中所做的那样:创建每个汽车实体的副本,因为它们' 被选中,但随后为该配置文件分配唯一的标识符。这样,当其他配置文件尝试从原始数据库中获取数据时,它会忽略那些附加了唯一标识符的实体?
  • 不,不创建副本。当您想要更新“静态”数据时,唯一标识符只会让您的生活变得轻松。新实体,我们称之为CarConnection 用于将配置文件连接到汽车并将您想要的任何信息添加到连接中。对于配置文件,仅获取连接到该配置文件的 CarConnections。
猜你喜欢
  • 1970-01-01
  • 2011-04-27
  • 2012-01-10
  • 1970-01-01
  • 2011-04-01
  • 2012-12-18
  • 2011-01-14
  • 2015-07-04
  • 2017-01-10
相关资源
最近更新 更多