SQLite.swift:实现表示给定表的行的模型类的最佳方法?

时间:2015-04-21 13:06:29

标签: ios sqlite swift sqlite.swift

这是我刚才提出的问题(到目前为止),不需要太多/任何解释。

我已经解决了这个问题:

  • 每个类可能有initialiseTable()类似的函数,在初始化数据库模式时会调用它?
  • Expression<T>
  • 的每个类中的静态常量

我想我最关心的部分是用Query结果填充模型类的实例。

一如既往,提前感谢您的帮助:)

为那些尚未遇到它的人提供了很棒的SQLite.swift链接。


更新(22/4/15 14:13):

在考虑之后,我不确定是否在iVars中存储行数据,因为在保存和更新物流以及过度复杂化的过程中可能会变得棘手。

但是,我仍然认为使用模型类来表示行是一个好主意。我认为使用表示表行的模型类的主要好处是安全性。例如,知道Query有列name : Expression<String>。如果您开始在类之间传递Query实例

,那么这很棒

就像我说的那样,我不确定是否真的想开始创建一个具有iVar的类来表示每一列的行。如果你这样做,你可以开始进入ORM土地,我觉得它带有简单的SQLite.swift之美。通过为每列保留iVars,我能想到的唯一好处是,您可以在一个实例上调用refresh(),该实例将从数据库中检索最新数据,然后指向此实例的所有其他对象将具有最新的数据,而不必自己打DB。

也许只是有一个子类Query的类,并且有一个构造函数,它接受一个数据库并使用正确的表名初始化?也许这可能会以某种方式为行列提供getter。

我只是在这里大声思考试图给予一些思考的食物。这些想法非常不成熟和年轻,只是考虑到我可以采取的每种方法的局限和好处。当我改进想法时,会回来并添加/更改。


更新(24/4/15 09:45):

也许模型类应该只是数据库表的代理?每个类都有一个用于每个字段的setter,可以立即写入DB,这样状态就不会发生冲突,因为它总是反映数据库中的内容。但是,您将无法轻松管理多久访问数据库的频率?但。你真的经常改变价值吗?

1 个答案:

答案 0 :(得分:2)

结帐http://github.com/groue/GRDB.swift。它提供了一个现成的Record类,以及专注的协议,它们为任何自定义结构或类授予获取和持久性方法:

let persons = Persons.fetchAll(db, ...)
try Person(...).insert(db)

更新:GRDB是一个面向协议的库,这意味着它支持不可变模型。这与Core Data或Realm完全不同,并且会对应用程序设计产生影响。查看How to build an iOS application with SQLite and GRDB.swift