8

这是我(到目前为止)唯一一个不需要太多/任何解释的问题。

我已经解决了这个问题:

  • 每个类都可能有initialiseTable()一种类似的函数,在初始化 DB 模式时会被调用?
  • 列的每个类中的静态常量Expression<T>

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

与往常一样,提前感谢您的帮助:)

链接到很棒的SQLite.swift给那些还没有遇到过的人。


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

在考虑之后,我不确定是否将行数据存储在 iVars 中,因为它可能会变得很棘手,以保存锻炼和更新后勤并使事情变得过于复杂。

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

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

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

我只是在这里大声思考,试图提供一些思考。这些想法相当不成熟和年轻,只是在我脑海中思考你可以采取的每种方法的局限性和好处。当我完善这些想法时,会回来并添加/更改更多内容。


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

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

4

1 回答 1

2

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

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

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

于 2015-07-05T17:50:15.437 回答