两个不同的 managedObjects 和一个 sqlite 数据库?

Posted

技术标签:

【中文标题】两个不同的 managedObjects 和一个 sqlite 数据库?【英文标题】:Two different managedObjects and one sqlite database? 【发布时间】:2011-08-02 20:21:37 【问题描述】:

我正在尝试在同一个 sqlite 数据库中创建两个表。现在,这两个 managedObjectModel 不在同一个实例中运行。让我解释一下...我运行应用程序一次,然后以编程方式在持久存储中创建 managedObject。假设我有 5 个属性。然后我再次运行它并在持久存储中创建一个新的 managedObject,但这次我只使用 3 个属性......我怎样才能做到这一点?现在它崩溃了,因为属性的数量不匹配。

问候和感谢!

【问题讨论】:

你对问题的描述让我很困惑。你在这个应用程序中使用 Core Data 吗?您是否正在向数据模型中添加新实体?有没有可以显示的代码可以更清楚地说明您要完成的工作? 我正在使用 Core Data 是的。我以编程方式创建 managedObjectModel,而不是使用 xcdatamodel。 managedObjectModel 根据 X 的多少创建 X 数量的属性(假设 X 是从其他地方收集的,所以它并不总是相同的)。因此,如果我运行应用程序一次并且 X=5,managedObjectModel 将创建 5 个属性(称为属性 1...等)。然后如果我再次运行它并且 X=3,那么 managedObjectModel 将创建 3 个属性。现在因为我只使用一个SQLite数据库,所以当属性数量不一样时它会崩溃。 我得到的错误是:'这个 NSPersistentStoreCoordinator 没有持久存储。它无法执行保存操作。我很确定这是因为属性数量冲突......因为如果我将 X 设置为常数,我不会得到错误。 【参考方案1】:

最简单的答案是不要以编程方式创建数据模型。它应该在设计时创建而不是修改。相反,您应该将数据模型设计为足够灵活以满足您的需求。例如,与其创建一个具有可变数量属性的实体,不如创建两个实体,一个与另一个具有一对多关系,并将哪些信息存储在可变数量的属性中。

【讨论】:

嗯,这似乎是一个合理的解决方案。好的,假设我为另一个模型创建了一个名为“属性”的关系。如何访问 attribute1...attribute2 等?这个其他模型应该包括什么? 我将从 developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/… 开始。需要明确的是,您正在创建一个新实体,而不是一个新模型。您的关系将是您的第一个实体的属性之一,并将返回您的第二个实体类型的对象的 NSSet。它包含哪些信息完全取决于您。 所以基本上如果我要求 [entity valueForKey:@"attributes"] 它会返回一个 NSSet 值吗?是的,抱歉,我已经以编程方式执行了很多次,以至于我忘记了它们被称为实体。 我通常使用具体的 NSManagedObject 子类来表示实体,但使用 valueForKey 也可以。您将获得一个 NSManagedObjects 的 NSSet,其实体类型是您创建的第二个实体,用于保存属性数据。也就是说,假设您之前已将一些对象添加到该关系中。 我真的不知道如何处理xcdatamodel关系。我已经尝试在那里寻找好的教程......但实际上并没有,反正我也没有找到。你确定没有别的办法吗?

以上是关于两个不同的 managedObjects 和一个 sqlite 数据库?的主要内容,如果未能解决你的问题,请参考以下文章

在 SwiftUI NaviagationLink 中创建 ManagedObject

为啥existingObjectWithID 保存后会返回一个带temporaryID 的managedObject?

UITableView 更新正确数量的 managedObjects,但不会显示值

iPhone CoreData 属性:对 managedObjects 的更改太慢

核心数据:使用新创建的 ManagedObject 转至细节控制器

保存后 ManagedObject 的上下文为零