Realm Swift2:模型与Realm模型类分离的最佳实践

13

我刚刚开始使用 Swift 的 Realm。在阅读文档之后,仍然有几个问题需要解决。

我最大的一个问题是,是否有一种最佳实践来将 Model 类与 Realm 类分离。

例如,在 Java 的 MVC 项目中,我们使用 DAO 类(数据访问对象类)来负责与数据库层通信。 对应的模型类只有注入了 dao 对象,或者使用了服务类(如 CRUD 操作)。

如果我有一个 Realm “Model” 类,现在似乎这就是一切。但是,在将对象保存到数据库后,在 UI 层更改对象的属性会导致

'Attempting to modify object outside of a write transaction - call beginWriteTransaction on an RLMRealm instance first.'

这使我重新考虑我的想法:难道这不应该在 Realm 对象和模型对象中分开吗?还是在 View-Classes 中使用“realm.write”过程可以接受?

我对此进行了一些研究,但结果非常模糊。

在您的项目中,您如何处理这个问题?您有某种最佳实践或指导吗?

非常感谢 约翰


有趣的是你现在问这个问题 - 我刚开始将 Realm 数据库对象分离到它们自己的空间,并创建了相当于你的 DAO,因此我的应用程序直接与 DAO 通信,它们调用适当的 Realm 方法。我只是一两天前才开始,所以稍后会报告... - Stephen Watson
1个回答

4

就iOS而言,至少官方上还没有确立将模型类逻辑从实际的Realm Object子类中抽象出来的最佳实践。尽管如此,我之前确实听说过一些应用程序会这样做,以支持多种数据框架类型。

如果我要这样做,我会为每个模型制作一个单独的对象类,并实现自己的API来获取/设置数据属性,并使Realm对象成为该对象的内部成员。然后,该对象将作为我的应用程序逻辑和如何将数据保存到Realm之间的通用接口。这样,如果我想在以后更换数据框架,我只需用新的数据对象替换我的对象,但保持API一致即可。

关于您发布的错误消息,为了确保数据完整性,除非在写事务中(无论是在UI线程还是其他线程),否则不能修改Realm对象。尽管如此,您可以在该抽象对象中轻松地封装那个逻辑(即在当前线程上打开一个Realm写事务)。


谢谢TiM。那对我帮助很大。你所描述的是我个人在分离层方面更喜欢的方式。干杯,John。 - John B.
再次问候@TiM,您能否解释一下您所说的“将Realm对象作为此对象的内部成员”是什么意思?如果您有时间,可以给出一个非常简单的示例。 - Isuru
嗨,再次见到你,@Isuru!哇,这是一个老问题!我的意思是,由于您无法在写入事务之外修改Realm“Object”实例,因此您将使用包装类来隔离那些特定于Realm的逻辑。您将拥有一个通用模型对象,按照通常的方式与应用程序交互,但该对象本身在内部保留等效的Realm“Object”,并在隔离中执行所有Realm逻辑。这里的目标是能够在不需要改变类设计的情况下移除Realm并插入另一个数据库引擎。 :) - TiM
@TiM,根据我收集到的信息,我想出了一些东西,但我仍然有几个疑问。如果您能够好心看一下这里的新问题(https://dev59.com/nJ7ha4cB1Zd3GeqPnrz9),我会非常感激。 - Isuru
@TiM 好的,重新阅读了你的回答,解决了我一个疑问。你在包装类中为 Realm 模型类的属性创建了自己的 getter 和 setter。那么,如果/当你必须实例化这个 Realm 对象的一个实例,你是直接实例化呢?还是通过包装类? - Isuru

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