数据库样板代码
在业务开发的时候,经常需要把服务器返回的数据,存入到数据库。最经典的就是记录已登录用户的数据,在冷启动的时候,先展示之前缓存的数据,之后再请求接口展示最新的数据。
即使在FMDB、SQLite.swift等三方库的帮助下,也要写大量样板代码,尤其是数据模型的属性比较多的情况(说的就是用户数据模型,10个起步)。那么如何减少样板代码呢?使用ModelAdapter
库,1分钟搭建一个数据库不再是梦想!
ModelAdapter简介
ModelAdapter
是基于SQLite.swift
封装的SQLite ORM库,需要Swift 5.1+。减少SQLite.swift库需要的数据库定义、增删改查等样板代码,只需要简单的配置就能完成数据对象对应数据库的搭建。
ModelAdapter示例
现在开始计时,看看ModelAdapter
是如何在1分钟内完成一个数据库表的搭建呢?
原始数据模型
定义如下
struct CustomModel {
var userID: Int = 0
var nickName: String?
var phone: Int?
var age: Int = 0
}
第一步:Column定义
- 1、数据类型遵从
ModelAdapterModel
协议 - 2、非可选值属性使用
@Field
进行注解 - 3、可选值属性使用
@FieldOptional
进行注解 - 4、在
Field
或FieldOptional
初始化器填写column相关信息,column name默认是属性名
struct CustomModel: ModelAdapterModel {
@Field(key: "user_id", primaryKey: true)
var userID: Int = 0
@FieldOptional
var nickName: String?
@FieldOptional(unique: true)
var phone: Int?
@Field
var age: Int = 0
}
每个字段只需要添加@Field
或@FieldOptional
以及初始化参数填写,这一步花费30秒。
第二步:指定初始化器实现
- 实现
ModelAdapterModel
协议的指定初始化器,并且在init
方法调用initFieldExpressions
方法。
struct CustomModel: ModelAdapterModel {
init() {
initFieldExpressions()
}
}
因为是样板代码,这一步花费1秒(Ctrl C+V大法)。
第三步:数据库DAO定义
- 自定义
CustomDAO
类,遵从ModelAdapterDAO
协议 - 设置关联类型
Entity
为CustomModel
- 实现
ModelAdapterDAO
协议要求的connection
和table
属性 - 整个数据库层的定义就完成了,不需要自己写增删改查的样板代码了。
class CustomDAO: ModelAdapterDAO {
typealias Entity = CustomModel
var connection: Connection = try! Connection("\(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0])/db.sqlite3")
var table: Table = Table("user")
required init() {
}
}
这一步需要稍微配置一下,预计花费20秒。
第四步:🎉撒花庆祝,CustomModel
对应的数据库表创建好了
前三步合计总耗时51秒,算是超额完成任务了🎉。如果后续使用ModelAdapter
的朋友多的话,再考虑写一个Xcode插件,前面三步花费的时间甚至可以缩短至30秒内。
下面是整个示例的完整代码:
struct CustomModel: ModelAdapterModel {
@Field(key: "user_id", primaryKey: true)
var userID: Int = 0
@FieldOptional
var nickName: String?
@FieldOptional(unique: true)
var phone: Int?
@Field
var age: Int = 0
init() {
initFieldExpressions()
}
}
class CustomDAO: ModelAdapterDAO {
typealias Entity = CustomModel
var connection: Connection = try! Connection("\(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0])/db.sqlite3")
var table: Table = Table("user")
required init() {
}
}
开始使用
通过JSON字典数据创建model。
引入了ObjectMapper库完成JSON To Model。
let jsonDict = ["user_id" : 123, "nickName" : "暴走的鑫鑫", "phone": 123456, "age": 33]
let model = CustomModel(JSON: jsonDict)!
创建dao实例并创建数据库表单
let dao = CustomDAO()
dao.createTable()
插入数据
try? dao.insert(entity: model)
删除数据
try? dao.delete(model.$userID.expression == 123)
更新数据
model.phone = 654321
try? dao.update(entity: model, model.$userID.expression == 123)
查询数据
//查询全部
let queryAll = try? dao.queryAll()
//条件查询
let queryOne = try? dao.query(model.$userID.expression == 123)
ModelAdapter更多细节
- 自定义column key
- 自动创建数据库column
- 存储自定义类型
- 自定义存储属性
- 自定义数据库操作 请点击ModelAdapter Github地址进行了解。
ModelAdapter的灵感
- ModelAdapter的灵感来自于android的Room库
- 在SQLite.swift三方库的基础上进行搭建
- 借助@Property Wrapper特性实现了类似的效果