在业务开发的时候,经常需要把服务器返回的数据,存入到数据库。最经典的就是记录已登录用户的数据,在冷启动的时候,先展示之前缓存的数据,之后再请求接口展示最新的数据。
即使在FMDB、SQLite.swift等三方库的帮助下,也要写大量样板代码,尤其是数据模型的属性比较多的情况(说的就是用户数据模型,10个起步)。那么如何减少样板代码呢?使用ModelAdapter
库,1分钟搭建一个数据库不再是梦想!
ModelAdapter Github地址
ModelAdapter
是基于SQLite.swift
封装的SQLite ORM库,需要Swift 5.1+。减少SQLite.swift库需要的数据库定义、增删改查等样板代码,只需要简单的配置就能完成数据对象对应数据库的搭建。
现在开始计时,看看ModelAdapter
是如何在1分钟内完成一个数据库表的搭建呢?
定义如下
struct CustomModel {
var userID: Int = 0
var nickName: String?
var phone: Int?
var age: Int = 0
}
ModelAdapterModel
协议@Field
进行注解@FieldOptional
进行注解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大法)。
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() {
}
}
引入了ObjectMapper库完成JSON To Model。
let jsonDict = ["user_id" : 123, "nickName" : "暴走的鑫鑫", "phone": 123456, "age": 33]
let model = CustomModel(JSON: jsonDict)!
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 Github地址进行了解。