iOS開發(fā)對于本地持久化數(shù)據(jù)提供了多種解決途徑(歸檔,寫入文件,寫入plist,存入本地數(shù)據(jù)庫等等),今天我們就來看看sqlite的封裝和使用馆匿。有的小伙伴用coreData來操作sqlite竭钝,有的直接使用sql語句來操作sqlite梨撞,但大部分開發(fā)者都是FMDB的忠實粉絲。FMDB優(yōu)秀的封裝邏輯是開發(fā)者鐘情的原因所在香罐,但是在優(yōu)秀的第三方都會出現(xiàn)被棄用的可能性卧波,一旦此種情況發(fā)生而我們代碼到處充斥著此第三方的代碼,那么代碼的維護將是毀滅性的穴吹,而將此第三方封裝成一個獨立的工具類可完美的解決此問題幽勒!
上代碼!8哿睢啥容!
import FMDB
class DB: NSObject {
//單例
static let shareServeTool = DB()
//定義管理數(shù)據(jù)庫的對象
var db:FMDatabase!
//線程鎖,通過加鎖和解鎖來保證所做操作數(shù)據(jù)的安全性
let lock = NSLock()
/**
*1.重寫父類的構(gòu)造方法
*/
override init() {
super.init()
//設(shè)置數(shù)據(jù)庫的路徑;fmdb.sqlite是由自己隨意命名
let path = NSTemporaryDirectory().appending("library.db")
print(path)
//構(gòu)造管理數(shù)據(jù)庫的對象
db = FMDatabase(path: path)
//判斷數(shù)據(jù)庫是否打開成功;如果打開失敗則需要創(chuàng)建數(shù)據(jù)庫
if !db.open() {
print("數(shù)據(jù)庫打開失敗")
return
}else{
self.create()
}
}
/*****************************1.創(chuàng)建表********************************/
func create() {
//創(chuàng)建數(shù)據(jù)庫
//student表達表名,由自己命名
//uid,data是需要收藏的模型中的字段顷霹,須根模型中保持一致
//varchar表示字符串咪惠,integer表示數(shù)字让网,blob表示二進制數(shù)據(jù)NSData
let createSql = "CREATE TABLE IF NOT EXISTS userCache(keys varchar(300),valu varchar(300))"
//執(zhí)行sel語句進行數(shù)據(jù)庫的創(chuàng)建
do {
try db.executeUpdate(createSql, values: nil)
}catch {
print(db.lastErrorMessage())
}
}
/*****************************2.增********************************/
func insertDataWith(valu:String,keys:String) {
//加鎖操作
lock.lock()
//sel語句
//(?,?)表示需要傳的值刊愚,對應(yīng)前面出現(xiàn)幾個字段,后面就有幾個問號
let insetSql = "insert into user(keys , valu) values(?,?)"
//更新數(shù)據(jù)庫
do {
try db.executeUpdate(insetSql, values: [keys,valu])
}catch {
print(db.lastErrorMessage())
}
//解鎖
lock.unlock()
}
/*****************************3.刪********************************/
func deleteDataWith(keys:String) {
//加鎖操作
lock.lock()
//sel語句
//where表示需要刪除的對象的索引褥琐,是對應(yīng)的條件
let deleteSql = "delete from user where keys = ?"
//更新數(shù)據(jù)庫
do{
try db.executeUpdate(deleteSql, values: [keys])
}catch {
print(db.lastErrorMessage())
}
//解鎖
lock.unlock()
}
/*****************************4.改********************************/
func updateDataWith(valu:String,keys:String) {
//加鎖
lock.lock()
//where id = ?中的id可傳可不傳
let updateSql = "update user set values = ? where keys = ?"
//更新數(shù)據(jù)庫
do{
try db.executeUpdate(updateSql, values: [valu])
}catch {
print(db.lastErrorMessage())
}
//解鎖
lock.unlock()
}
/********5.判斷數(shù)據(jù)庫中是否有當(dāng)前數(shù)據(jù)(查找一條數(shù)據(jù))*********************/
func isHasDataInTable(keys:String) -> Bool {
let isHas = "select * from user where keys = ?"
do{
let set = try db.executeQuery(isHas, values: [keys])
//查找當(dāng)前行朵纷,如果數(shù)據(jù)存在炭臭,則接著查找下一行
if set.next() {
return true
}else {
return false
}
}catch {}
return true
}
/********6.根據(jù)條件查找數(shù)據(jù)*********************/
func fetchAllData(keys:String) ->([String]){
let fetchSql = "select * from user where keys = ?"
//用于符合條件數(shù)據(jù)的臨時數(shù)組
var tempArray = [String]()
do {
let set = try db.executeQuery(fetchSql, values: [keys])
//循環(huán)遍歷結(jié)果
while set.next() {
var valu = String()
//給字段賦值
valu = set.string(forColumn: "valu")!
tempArray.append(valu)
}
}catch {
print(db.lastErrorMessage())
}
return (tempArray)
}
func fetchAllData() ->([String],[String] ){
let fetchSql = "select * from user"
//用于承接所有數(shù)據(jù)的臨時數(shù)組
var tempArray = [String]()
var tempArrays = [String]()
do {
let set = try db.executeQuery(fetchSql, values: nil)
//循環(huán)遍歷結(jié)果
while set.next() {
var values = String()
var keys = String()
//給字段賦值
values = set.string(forColumn: "data")!
keys = set.string(forColumn: "keys")!
tempArray.append(values)
tempArrays.append(keys)
}
}catch {
print(db.lastErrorMessage())
}
return (tempArray,tempArrays)
}
}