Swift开发对FMDB的二次封装
2019-04-29 本文已影响0人
一把好刀
iOS开发对于本地持久化数据提供了多种解决途径(归档,写入文件,写入plist,存入本地数据库等等),今天我们就来看看sqlite的封装和使用。有的小伙伴用coreData来操作sqlite,有的直接使用sql语句来操作sqlite,但大部分开发者都是FMDB的忠实粉丝。FMDB优秀的封装逻辑是开发者钟情的原因所在,但是在优秀的第三方都会出现被弃用的可能性,一旦此种情况发生而我们代码到处充斥着此第三方的代码,那么代码的维护将是毁灭性的,而将此第三方封装成一个独立的工具类可完美的解决此问题!
上代码!!!
import FMDB
class DB: NSObject {
//单例
static let shareServeTool = DB()
//定义管理数据库的对象
var db:FMDatabase!
//线程锁,通过加锁和解锁来保证所做操作数据的安全性
let lock = NSLock()
/**
*1.重写父类的构造方法
*/
override init() {
super.init()
//设置数据库的路径;fmdb.sqlite是由自己随意命名
let path = NSTemporaryDirectory().appending("library.db")
print(path)
//构造管理数据库的对象
db = FMDatabase(path: path)
//判断数据库是否打开成功;如果打开失败则需要创建数据库
if !db.open() {
print("数据库打开失败")
return
}else{
self.create()
}
}
/*****************************1.创建表********************************/
func create() {
//创建数据库
//student表达表名,由自己命名
//uid,data是需要收藏的模型中的字段,须根模型中保持一致
//varchar表示字符串,integer表示数字,blob表示二进制数据NSData
let createSql = "CREATE TABLE IF NOT EXISTS userCache(keys varchar(300),valu varchar(300))"
//执行sel语句进行数据库的创建
do {
try db.executeUpdate(createSql, values: nil)
}catch {
print(db.lastErrorMessage())
}
}
/*****************************2.增********************************/
func insertDataWith(valu:String,keys:String) {
//加锁操作
lock.lock()
//sel语句
//(?,?)表示需要传的值,对应前面出现几个字段,后面就有几个问号
let insetSql = "insert into user(keys , valu) values(?,?)"
//更新数据库
do {
try db.executeUpdate(insetSql, values: [keys,valu])
}catch {
print(db.lastErrorMessage())
}
//解锁
lock.unlock()
}
/*****************************3.删********************************/
func deleteDataWith(keys:String) {
//加锁操作
lock.lock()
//sel语句
//where表示需要删除的对象的索引,是对应的条件
let deleteSql = "delete from user where keys = ?"
//更新数据库
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 = ?"
//更新数据库
do{
try db.executeUpdate(updateSql, values: [valu])
}catch {
print(db.lastErrorMessage())
}
//解锁
lock.unlock()
}
/********5.判断数据库中是否有当前数据(查找一条数据)*********************/
func isHasDataInTable(keys:String) -> Bool {
let isHas = "select * from user where keys = ?"
do{
let set = try db.executeQuery(isHas, values: [keys])
//查找当前行,如果数据存在,则接着查找下一行
if set.next() {
return true
}else {
return false
}
}catch {}
return true
}
/********6.根据条件查找数据*********************/
func fetchAllData(keys:String) ->([String]){
let fetchSql = "select * from user where keys = ?"
//用于符合条件数据的临时数组
var tempArray = [String]()
do {
let set = try db.executeQuery(fetchSql, values: [keys])
//循环遍历结果
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"
//用于承接所有数据的临时数组
var tempArray = [String]()
var tempArrays = [String]()
do {
let set = try db.executeQuery(fetchSql, values: nil)
//循环遍历结果
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)
}
}