核心数据编码模式

Posted

技术标签:

【中文标题】核心数据编码模式【英文标题】:Core Data Coding Pattern 【发布时间】:2018-08-14 20:26:53 【问题描述】:

我一直在使用带有实体框架 (EF) 的存储库设计模式来使用 C#,它允许我使用每个表的通用类与数据库进行交互。

此存储库具有我需要的所有功能,例如:向数据库中添加新实体、更新现有实体、删除实体、保存上下文等等......

例如,我在数据库中有一个名为“Person”的实体。我将创建一个名为 PersonRepository 的新类,它具有更改/向数据库添加值所需的所有功能。

因此,要与数据库交互,您需要创建存储库类的实例。然后,这允许您调用该类的函数,该函数又与数据库交互。这种模式的想法是,您对实体的所有数据库调用都被隔离到一个类中,这提高了可测试性和关注点分离。

我正在学习如何在我的 Swift 程序中使用 Core Data,它似乎类似于 C# 中的 EF。我已经在 .xcdatamodel 文件中创建了实体,并通过 Editor > Create NSManageedObject subclasses 选项创建了关联的 Cocoa Touch 类。

我使用了“Category/Extension”CodeGen 选项,因此,我创建了一个名为“Exercise”的新类。根据我的阅读,这个类可以包含额外的逻辑,例如覆盖 prepareForDeletion 方法。这是否意味着我可以将 addEntity、updateEntity 函数添加到此方法中,然后从其他代码文件中调用它们?

我的问题是:

    我能否实现可以在 C# 中使用的相同存储库模式? 我相信这将在我的实体的生成类上(见下图)

    我应该将所有数据库调用函数放在哪里?如果我可以使用此存储库模式,我会将它们放在那里,但是,如果我不能,我是否将它们放在单独的代码文件中?我应该将它们放在为添加额外逻辑而创建的生成实体文件中吗?

    如果我可以使用存储库模式,有没有办法将上下文注入到此类中,或者,每次我想更改它时都必须调用 getContext 方法吗?在 C# 中,每次我想对数据库进行更改时,我们都可以使用服务将上下​​文注入到类中 - 我不确定在 Swift 中是否可以这样做。

【问题讨论】:

【参考方案1】:

如果我理解正确,在 Swift 中,相当于您的“存储库”类可能是两件事之一。它可能是核心数据的上下文,您将运行查询并将其保存到或者(更有可能)您将创建一个新的类或结构,从业务方面掩盖核心数据。假设后者,您的“dataManager”类将执行与核心数据的所有交互。然后它可以将 NSmanagedobjects 返回到业务端,或者您可以映射/转换/转换为其他类型。

是的,Exercise 是 nsmanagedobject 的子类,因此它具有托管对象的所有核心数据功能,但您可以添加任何您想要的自定义函数。

您的数据管理器类将执行查询并返回正确的对象。比如data manger.getExercises() -> [Exercises], dataManager.save(_exercise:Exercises)等......

您需要在模式中考虑线程安全。一种选择是将 nsmanagedobjects 转换为 datamanager 中的结构,而不返回 nsmangedobjects。结构是线程安全的,并且使用可编码,您可以轻松地在 exerciseManagedOjbect 和 exerciseStruct 之间进行转换。此外,通过这个 dataManager 类示例,您可以在将来删除另一个持久性选项的核心数据,从而减少对您的应用整体的影响。

【讨论】:

以上是关于核心数据编码模式的主要内容,如果未能解决你的问题,请参考以下文章

今日知识回顾: 一运行程序的三个核心硬件及计算机系统 二Python解释器运行一个.py文件步骤 三字符编码 四文件处理

我可以通过编码在核心数据中创建和删除实体吗

JSON编码和解码核心数据

核心数据 NSManagedObject 到 JSON 编码不起作用

编辑核心数据会产生错误,此类与键的键值编码不兼容

绑定和核心数据:实体 xxx 不符合键“(null)”的键值编码