SQLiteValueExtension
基于 SQLite.swift
库,易于存储 Array
、Dictionary
或自定义数据类型。
原理:将 Array
、Dictionary
或自定义类型转换为 String
类型,然后存储。查询时,将字符串转换为 Array
、Dictionary
或自定义数据类型。
使用
符合 SQLiteValueStringExpressible
协议的数据类型,可以通过 SQLite.swift
存储到数据库中。
原生基本类型
以下基本类型符合 SQLiteValueStringExpressible
协议:-Int
、-Int64
、-Bool
、-Double
、-Float
、-String
、-Blob
、-Data
、-Date
数组,字典
Array.Element
、Dictionary.Key
和 Dictionary.Value
类型符合 SQLiteValueStringExpressible
协议,可以通过 SQLite.swift
存储到数据库中。
//Expression definition
static let intArray = Expression<[Int]?>("int_array")
static let intStringDict = Expression<[Int:String]?>("int_string_dict")
//Insert
let insert = config.insert(normalInt <- basic.normalInt, intStringDict <- basic.intStringDict)
try connection.run(insert)
//Query
let rows = try connection.prepare(config)
var result = [BasicDataModel]()
for data in rows {
let basic = BasicDataModel(JSON: [String: Any]())!
basic.normalInt = data[normalInt]
basic.intStringDict = data[intStringDict]
result.append(basic)
}
自定义类型
遵循 SQLiteValueStorable
协议并实现相关方法。
SQLiteValueStorable
继承了 SQLiteValueStringExpressible
协议,并在扩展中指定 datatypeValue
为 String
,以便更容易使用。
extension BasicInfoModel: SQLiteValueStorable {
public static func fromStringValue(_ stringValue: String) -> BasicInfoModel {
return BasicInfoModel(JSONString: stringValue) ?? BasicInfoModel(JSON: [String: Any]())!
}
public var stringValue: String {
return toJSONString() ?? ""
}
}
存储包含自定义数据类型的数组或字典的示例
//Expression definition
static let modelArray = Expression<[BasicInfoModel]?>("model_array")
static let stringModelDict = Expression<[String:BasicInfoModel]?>("string_model_dict")
//Insert
let insert = config.insert(modelArray <- basic.modelArray, stringModelDict <- basic.stringModelDict)
try connection.run(insert)
//Query
let rows = try connection.prepare(config)
var result = [BasicDataModel]()
for data in rows {
let basic = BasicDataModel(JSON: [String: Any]())!
basic.modelArray = data[modelArray]
basic.intStringDict = data[intStringDict]
result.append(basic)
}
支持基本类型
例如,Float
数据类型
extension Float: SQLiteValueStringExpressible {
public static var declaredDatatype: String {Double.declaredDatatype}
public static func fromDatatypeValue(_ datatypeValue: Double) -> Float {
return Float(datatypeValue)
}
public var datatypeValue: Double {
return Double(self)
}
public static func fromStringValue(_ stringValue: String) -> Float {
return Float(stringValue) ?? 0
}
public var stringValue: String {
return String(self)
}
}
如果您需要支持其他基本数据类型,请提交 Issue 或 Pull Request。
安装
Cocoapods
pod'SQLiteValueExtension'
SPM
从版本 0.0.6 开始支持。
有关 Xcode11 的安装教程,请参阅文章:[在 Xcode 中使用 Swift Package](https://xiaozhuanlan.com/topic/9635421780)。
推荐
-ModelAdaptor:基于 SQLite.swift
的轻量级 ORM 库。-SQLite.swift 自定义类型