模型绑定
模型绑定(Object-relational Mapping,简称 ORM),通过对 Swift 类或结构进行绑定,形成类或结构 - 表模型、类或结构对象 - 表的映射关系,从而达到通过对象直接操作数据库的目的。
- 字段映射
- 字段约束
- 索引
- 表约束
- 虚拟表映射
字段映射
在类内定义 CodingKeys 的枚举类,并遵循 String 和CodingTableKey。枚举列举每一个需要定义的字段。
1.别名映射 => case identifier = “id”
2.对于变量名与 SQLite 的保留关键字冲突 => case offset = “db_offset”
字段约束
它用于定于针对单个字段的约束,如主键约束、非空约束、唯一约束、默认值等。
1 | ColumnConstraintBinding( |
自增
1 | let autoIncrementObject = Sample() |
索引
它用于定于针对单个或多个字段的索引,索引后的数据在能有更高的查询效率。
1 | class Sample: TableCodable { |
完整的索引名为表名+索引后缀,如:表 “sampleTable” 的索引分别为 “sampleTable_uniqueIndex”、”sampleTable_descendingIndex” 和 “sampleTable_multiIndex”。
表约束
它用于定于针对多个字段或表本身的约束。
1 | class Sample: TableCodable { |
1.MultiPrimaryBinding: 联合主键约束
2.MultiUniqueBinding: 联合唯一约束
3.CheckBinding: 检查约束
4.ForeignKeyBinding: 外键约束
虚拟表映射
它用于定于虚拟表以进行全文搜索等特性。
增删改查
插入操作
插入操作有 “insert” 和 “insertOrReplace” 两个接口。故名思义,前者只是单纯的插入数据,当数据出现冲突时会失败,而后者在主键一致时,新数据会覆盖旧数据。
propertyConvertibleList 插入指定字段
删除操作
1 | func delete(fromTable table: String, // 表名 |
将 table 表内,满足 condition 的数据,按照 orderList 的方式进行排序,然后从头开始第 offset 行数据后的 limit 行数据删除
1 | // 删除 sampleTable 中所有 identifier 大于 1 的行的数据 |
更新操作
update with object
update with row
1 | let object = Sample() |
1 | let row: [ColumnCodableBase] = ["update"] |
查找操作
- getObjects
- getObject
- getRows
- getRow
- getColumn
- getDistinctColumn
- getValue
- getDistinctValue
对象查找
1 | // 返回 sampleTable 中的所有数据 |
注意: 由于对象查找操作使用了范型,因此需要显式声明返回值的类型以匹配范型
对象部分查询
1 | let objects: [Sample] = try database.getObjects(fromTable: "sampleTable", |
注意:这里只获取了 identifier 字段,而没有获取 description 的值。这就可能与 Swift 本身存在冲突。 Swift 规定了对象创建时,必须初始化所有成员变量。而进行对象部分查询时,则可能出现某部分变量没有变查询,因此无法初始化的情况。因此,对于可能不被查询的成员变量,应将其类型定义为可选值。
倘若开发者不确定哪些字段可能会被进行对象部分查询,可以将所有字段都定义为可选。
值查询操作
identifier | description |
---|---|
1 | “sample1” |
2 | “sample2” |
3 | “sample3” |
4 | “sample4” |
5 | “sample5” |
6 | “sample6” |
- getRows 接口获取整个矩阵的所有内容,即返回值为二维数组。
- getRow 接口获取某一横行的数据,即返回值为一维数组。
- getColumn 接口获取某一纵列的数据,即返回值为一维数组。
- getDistinctColumn 与 getColumn 类似,但它会过滤掉重复的值。
- getValue 接口获取矩阵中某一个格的内容。
- getDistinctValue 与 getValue 类似,但它会过滤掉重复的值。
1 | // 获取所有内容 |
数据库、表、事物
数据库 -
Database
、表 -Table
和 事务 -Transaction
- 支持增删查改的便捷接口
- 支持链式接口
- 数据和状态共享
- 线程安全
数据和状态共享,意味着对于 同一个路径的数据库 的 不同基础类,它们的标签、数据库是否打开、是否在进行读写操作等所有状态和数据都始终保持一致。
线程安全,意味着开发者可以在 任意线程 对 任意基础类 调用 任意接口,而不需要考虑数据库本身的线程安全问题。同时,WCDB Swift 会根据调用情况,并发执行操作,以达到更高的性能