集成
集成非常简单,可以把SQLite.swift下载下来直接拖进项目中,也可以用cocoaPods来继承,为了省事我使用的cocoaPods。
source 'https://github.com/CocoaPods/Specs.git'
platform:ios,'10.0'
use_frameworks!
target 'SwiftStudy03' do
pod 'SQLite.swift', '~> 0.12.2'
xcodeproj '/Users/adiqueen/Desktop/SwiftStudyDemos/SwiftStudy04/SwiftStudy03.xcodeproj'
end
另外,为了能能够正常的使用SQLite.swift,需要在General->Frameworks,Libraries,and Embedded Content添加SystemConfigration.framework
添加SystemConfigration.framework
需要的地方直接:import SQLite 引入即可。
下面是一个简单封装的事例代码,仅供个人学习于参考。
LGJDataStore
单例类,建表连库
import Foundation
import SQLite
enum DataAccessError: Swift.Error {
case datastoreConnectionError
case insertError
case deleteError
case searchError
case nilInData
case nomoreData
}
class LGJDataStore {
static let sharedInstance = LGJDataStore()
let LGJDB: Connection?
private init() {
let dirs: [String] = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.allDomainsMask, true) as [String]
let dir = dirs[0]
let path = dir.appending("LGJ.sqlite")
print("The DB Path:", path)
do {
LGJDB = try Connection.init(path)
LGJDB?.busyTimeout = 5
LGJDB?.busyHandler({ tries in
if tries >= 3 {
return false
}
return true
})
}catch _ {
LGJDB = nil
}
}
func createTables() throws {
do {
try LGJDataHelper.createTable()
} catch {
throw DataAccessError.datastoreConnectionError
}
}
}
LGJDataHelperProtocol
协议,声明一系列增删改查的操作
import Foundation
protocol LGJDataHelperProtocol {
associatedtype T
static func createTable() throws -> Void
static func insert(item: T) throws -> Int
static func find(queryUserId: Int) throws -> [T]
}
//Optional implementation
extension LGJDataHelperProtocol {
static func update(id: Int, value: T) throws -> T? {return nil}
static func update(item: T) throws -> Bool {return false}
static func delete(item: T) throws -> Bool {return false}
static func findAll() throws -> [T]? {return nil}
static func checkColimnExists(queryUserId: Int) throws -> Bool { return false }
}
LGJDataHelper
一个实现LGJDataHelperProtocol的class,完成具体的数据操作
import Foundation
import SQLite
class LGJDataHelper: LGJDataHelperProtocol {
static let TABLE_NAME = "lgj_userinfo"
static let userId = Expression<Int>("userId")
static let name = Expression<String>("name")
static let icon = Expression<UIImage>("icon")
static let table = Table(TABLE_NAME)
typealias T = LGJUserInfoModel
static func createTable() throws {
guard let DB = LGJDataStore.sharedInstance.LGJDB else {
throw DataAccessError.datastoreConnectionError
}
do {
_ = try DB.run(table.create(ifNotExists: true){t in
t.column(userId)
t.column(name)
t.column(icon)
})
}catch _ {
throw DataAccessError.datastoreConnectionError
}
}
static func insert(item: T) throws -> Int {
guard let DB = LGJDataStore.sharedInstance.LGJDB else {
throw DataAccessError.datastoreConnectionError
}
let insert = table.insert(userId <- item.userId, name <- item.name, icon <- item.icon)
do {
let rowId = try DB.run(insert)
guard rowId >= 0 else {
throw DataAccessError.insertError
}
return Int(rowId)
}catch _ {
throw DataAccessError.insertError
}
}
static func update(item: T) throws -> Bool {
guard let DB = LGJDataStore.sharedInstance.LGJDB else {
throw DataAccessError.datastoreConnectionError
}
let query = table.filter(item.userId == userId)
if try DB.run(query.update(userId <- item.userId, name <- item.name, icon <- item.icon)) > 0 {
return true
}else{
return false
}
}
static func checkColimnExists(queryUserId: Int) throws -> Bool {
guard let DB = LGJDataStore.sharedInstance.LGJDB else {
throw DataAccessError.datastoreConnectionError
}
let query = table.filter(queryUserId == userId).exists
let isExists = try DB.scalar(query)
return isExists
}
static func delete(item: T) throws -> Bool {
guard let DB = LGJDataStore.sharedInstance.LGJDB else {
throw DataAccessError.datastoreConnectionError
}
let id = item.userId
let query = table.filter(userId == id)
do {
let tmp = try DB.run(query.delete())
guard tmp == 1 else {
throw DataAccessError.deleteError
}
}catch _ {
throw DataAccessError.deleteError
}
return true
}
static func find(queryUserId: Int) throws -> [LGJUserInfoModel] {
guard let DB = LGJDataStore.sharedInstance.LGJDB else {
throw DataAccessError.datastoreConnectionError
}
let query = table.filter(queryUserId == userId)
let items = try DB.prepare(query)
var retArray = [T]()
for item in items {
retArray.append(LGJUserInfoModel(userId: item[userId], name: item[name], icon: item[icon]))
}
return retArray
}
static func findAll() throws -> [LGJUserInfoModel]? {
guard let DB = LGJDataStore.sharedInstance.LGJDB else {
throw DataAccessError.datastoreConnectionError
}
var retArray = [T]()
let items = try DB.prepare(table)
for item in items {
retArray.append(LGJUserInfoModel(userId: item[userId], name: item[name],icon: item[icon]))
}
return retArray
}
}
LGJUserInfoModel
用户数据模型,简单定义了属性、初始化方法及数据存储实现。
import Foundation
import UIKit
import SQLite
// user info
struct LGJUserInfoModel {
var userId: Int = 0
var name: String = ""
var icon: UIImage = UIImage.init(named: "default")!
init() {}
init(userId: Int, name: String, icon: UIImage) {
self.userId = userId
self.name = name
self.icon = icon
}
}
extension NSData: Value {
//SQL Type
public static var declaredDatatype: String {
return Blob.declaredDatatype
}
//Decode
public static func fromDatatypeValue(_ datatypeValue: Blob) -> NSData {
return NSData(bytes: datatypeValue.bytes, length: datatypeValue.bytes.count)
}
//Encode
public var datatypeValue: Blob {
return Blob(bytes: self.bytes, length: self.length)
}
}
extension UIImage: Value {
public static var declaredDatatype: String{
return Blob.declaredDatatype
}
public static func fromDatatypeValue(_ blobValue: Blob) -> UIImage {
return UIImage(data: Data.fromDatatypeValue(blobValue))!
}
public var datatypeValue: Blob {
return self.pngData()!.datatypeValue
}
}
具体应用起来就简单的多了
//MARK
extension ViewController {
func creatDB() {
do {
try LGJDataStore.sharedInstance.createTables()
}catch _ {
print("create DB error")
}
}
func insertUserModel() {
let userModel = LGJUserInfoModel(userId: 100, name: "liugaojian", icon: UIImage.init(named: "default")!)
do {
let torId = try LGJDataHelper.insert(item: userModel)
print(torId)
} catch _ {
print("insert userModel error")
}
}
func checkUserModel() {
do {
let exists = try LGJDataHelper.checkColimnExists(queryUserId: 100)
print(exists)
} catch _ {
print("check userModel error")
}
}
func updateUserModel() {
let userModel = LGJUserInfoModel(userId: 100, name: "guhongjuan", icon: UIImage.init(named: "local")!)
do {
let isSuccess = try LGJDataHelper.update(item: userModel)
print(isSuccess)
} catch _ {
print("update userModel error")
}
}
func getUserModel() {
do {
let items = try LGJDataHelper.find(queryUserId: 100)
if let item = items.first {
print(item.userId, item.name, item.icon)
}
} catch _ {
print("get userModel error")
}
}
func getAllUserModel() {
do {
let items = try LGJDataHelper.findAll()!
for item: LGJUserInfoModel in items {
print(item.userId, item.name, item.icon)
}
} catch _ {
print("find userModel error")
}
}
}
触发以下方法
creatDB()
insertUserModel()
checkUserModel()
updateUserModel()
getUserModel()
getAllUserModel()
因为我们有些功能实现了简单的打印操作,下面是打印结果:
打印
网友评论