1分钟搭建完数据库,你敢信吗?

发布于 2022年 01月 27日 07:27

数据库样板代码

在业务开发的时候,经常需要把服务器返回的数据,存入到数据库。最经典的就是记录已登录用户的数据,在冷启动的时候,先展示之前缓存的数据,之后再请求接口展示最新的数据。

即使在FMDBSQLite.swift等三方库的帮助下,也要写大量样板代码,尤其是数据模型的属性比较多的情况(说的就是用户数据模型,10个起步)。那么如何减少样板代码呢?使用ModelAdapter库,1分钟搭建一个数据库不再是梦想!

ModelAdapter简介

ModelAdapter Github地址

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、在FieldFieldOptional初始化器填写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协议
  • 设置关联类型EntityCustomModel
  • 实现ModelAdapterDAO协议要求的connectiontable属性
  • 整个数据库层的定义就完成了,不需要自己写增删改查的样板代码了。
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特性实现了类似的效果

推荐文章