前言
GYDataCenter 是一个 SQLite 数据库框架,提供了一套简单易用的面向对象的数据操作接口,同时保留了 SQL 查询的灵活性。GYDataCenter 简单易上手,相对于 CoreData,GYDataCenter 的学习成本更低。同时,根据自己的需求,开发者可以更方便地划分数据库,设计数据库表,数据库索引等。
OC使用说明请参考官方文档,在这里我们只讨论Swift下使用GYDataCenter。
pod版本
为了兼容FMDB,应把FMDB版本置为2.6.2,最新的2.7.2会变异报错。
- pod 'GYDataCenter'
- pod 'FMDB', '~> 2.6.2' # 为了兼容GYDataCenter
快速上手
创建模型类继承于GYModelObject,然后实现GYModelObjectProtocol的代理方法即可。由于在Swift项目中写相关代码时不会很友好的出现提示,所以这里必须手写代码。
// 示例代码
class ExampleModel: GYModelObject {
// MARK: - GYModelObjectProtocol
// 返回数据库的名字
override class func dbName() -> String {
return "数据库名"
}
// 返回表的名字
override class func tableName() -> String {
return "表名"
}
// 返回主键的属性名
override class func primaryKey() -> String {
return "主键"
}
// 返回需要持久化的属性名
override class func persistentProperties() -> [Any] {
return [属性数组]
}
}
然后我们在定义模型属性的时候需要加上@objc dynamic关键字,因为在GYDataCenter中使用到了KVO,属性会动态派发,然而我们知道Swift是静态语言,如果要像Objective-C使用运行时特性或者动态替换方法、属性的话,需要加上dynamic关键字,因为'dynamic' must also be '@objc',所以dynamic前面需要再加上@objc关键字。
class ExampleModel: GYModelObject {
@objc dynamic var uid: Int?
@objc dynamic var name: String?
@objc dynamic var age: Int?
@objc dynamic var gender: String?
@objc dynamic var subModels: [ExampleSubModel]?
// MARK: - GYModelObjectProtocol
// 返回数据库的名字
override class func dbName() -> String {
return "EXAMPLE_DATABASE"
}
// 返回表的名字
override class func tableName() -> String {
return "EXAMPLE_TABLE_NAME"
}
// 返回主键的属性名
override class func primaryKey() -> String {
return "uid"
}
// 返回需要持久化的属性名
override class func persistentProperties() -> [Any] {
return ["uid","name","age","gender","subModels"]
}
}
class ExampleSubModel: GYModelObject {
@objc dynamic name: String?
}
增删改查
使用sql语句进行增删改查,方法同OC,参考官方文档
realm & WCDB
使用realm时,继承realm的模型基类Object,其属性也要添加@objc dynamic关键字。
class Person: Object {
@objc dynamic var name = ""
@objc dynamic var age = 0
}
使用微信的数据库WCDB时,由于目前最新版Xcode9.3和Swift4.1的改动,WCDB在Xcode9.3中编译报错,这里不做相关讨论。等苹果大大把这个问题修复后,再尝试WCDB。
It's said that Swift 4.1 is source compatible to 4.0, which means that developers can recompile the code without any changes.
However, not.