如何在Core Data上下文之外使用Core Data模型子类?

3

我正在尝试用Swift制作一个天气应用程序,将添加到Core Data中的城市保存下来,每个城市都包含一个天气对象,也保存在Core Data中,还有其他各种变量。

但很快我发现,在Core Data上下文之外使用NSManagedObjects子类几乎是不可能的(处理NSNumber等内容,没有自定义init,必须将它们保存在某个地方,如果明天不再使用Core Data会怎样...)。

那么保持使用Core Data但同时在其上下文之外使用模型的最佳实践是什么?

我目前的解决方案是为每个模型创建一个类,例如:

class City
{
    var country: String?
    var name: String?
    // ...
}

这个类对应的是:

class CD_City
{
    @NSManaged var country: String?
    @NSManaged var name: String?
    // ...
}

所以我可以随意在任何地方使用City。但是我需要一个函数将City转换为CD_City,反之亦然。所以我真的不确定我是否以最佳方式完成了它。

另外,您会推荐哪种转换方法呢?

(FYI,我正在使用MagicalRecord作为Core Data助手)

2个回答

4
TL;DR - 不要这样做,否则会出问题。
过去有各种方法可以让它勉强工作,但它们都依赖于CoreData中未记录的行为。我永远不会在想要展示给其他人或者交付给客户的代码中使用这样的东西。CoreData需要插入代理对象以钩住模型对象上的属性更改事件,而它能够可靠地完成这个任务并跟踪原始数据值的位置,是因为它负责首次创建这些实体;这也使故障和唯一性系统起作用。不要把Core Data看作是ORM,它真正是一个对象图管理框架,因此它被设计成以特定的方式使用,没有简单的解决方案可以安全地绕过它。

那么我的解决方案也不被推荐吗?例如,在 ViewController 中如何使用您的模型?我的意思是,在我的情况下,我想根据用户位置创建一个城市,但我不想将其保存到 Core Data,按照您的说法,我就不能这样做了? - allbto
CD 从头设计就是为了管理它自己的对象及其创建。要么不使用 Core Data,要么将您的对象作为协议传递给控制器。您的 CD 实体可以实现该协议,' 愚蠢 ' 的不在 CD 中的对象也可以,这样您的控制器不会注意到任何区别。我鼓励您重新审视一下 CoreData 对需求的支持,也许有其他满足您需要的持久化机制,而且没有 CD 的包袱。 - RyanR
我花了太长时间才找到这个链接:YAPDatabase非常不错。 - RyanR
协议的想法很棒!谢谢你提供数据库链接。 - allbto

2

如果您不想保存NSManagedObject或其子类,则可以使用以下方法创建它:

init(entity entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext?)

如果你想创建一个实例但是不保存到MOC中,可以传入nil参数到insertIntoManagedObjectContext函数。

如果之后需要将其保存到MOC中,可以使用NSManagedObjectContext的

func insertObject(_ object: NSManagedObject)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接