什么是FMDB:

FMDB是一个和iOS的SQLite数据库操作相关的第三方框架。主要把C语言操作数据库的代码用OC进行了封装。使用者只需调用该框架的API就能用来创建并连接数据库,创建表,查询等。

为什么要使用FMDB

1、轻量级,灵活。不消耗太多性能
2、FMDB将C语言的iOS系统的SQLite数据库的操作代码用OC进行封装,面向对象,容易理解和使用
3、提供了线程不安全的解决方案。

该框架有三个重要的类

1、FMDatabase
一个FMDatabase对象就代表一个单独的SQLite数据库,通过下面代码添加一个FMDatabase

首先声明为对象

///创建一个dataBase的一个全局对象

   var db : FMDatabase?

然后在openDB方法中初始化
func openDB(dbName : String){
///给路径后面加一个!
let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last! print(path) ///创建一个dbBase的数据库的对象
db = FMDatabase(path:"\(path)/\(dbName)")
///判断是否创建成功,需要强制解包
if db!.open() {
print("数据库创建成功")
}else{
print("数据库创建失败")
}
}

2、FMResultSet
使用FMDatabase执行查询后,得到结果集
3、FMDatabaseQueue
用于解决线程不安全的类,避免每个线程创建一个数据库,导致数据库冗余。

下面是两个重要的方法,用于执行sqlite语句,我们在插入数据和查询数据的时候都需要使用到该方法。

///查询数据
class func query() -> [[String : AnyObject]]{ let sql = "SELECT * FROM t_emotion"
var resultArray: [[String : AnyObject]] = [] FMDBQueueManager.shareFMDBQueueManager.dbQueue?.inDatabase({ (db)->Void in ///执行查询
if let result = try? db.executeQuery(sql, values: []){
///简历查询后的数据
while result.next(){
///获取数据
let png = result.stringForColumn("png")
let text = result.stringForColumn("text")
let dict = ["png": png, "text": text]
resultArray.append(dict)
}
}
})
///查找到数据后将数据返回
return resultArray
}

下面这一份代码是FMBD的常见用法,我们使用FMDB框架来创建一个本地数据库,然后给该数据库中插入一百条数据。然后执行查询方法,来查找我们需要用到的数据。
我们在ViewController中调用插入数据和查询数据的方法。

import UIKit

class ViewController: UIViewController {

  override func viewDidLoad() {
super.viewDidLoad()
insert()
query()
} func insert(){ for i in 0...100 {
let emotion = FMDBModel(dict: ["png" : "啊啊啊哈\(i).png","text": "hahh\(i)"])
emotion.insert()
}
} func query(){
let dataArray = FMDBModel.query()
print(dataArray)
}
}

下面这一份代码是一个FMDBQueueManager管理类,我们在管理类中openDB(可以理解为打开数据库),然后creatTable创建一个表格。

import UIKit
import FMDB class FMDBQueueManager: NSObject { static let shareFMDBQueueManager = FMDBQueueManager() var dbQueue : FMDatabaseQueue? func openDB(dbName : String){ let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last!
print(path)
dbQueue = FMDatabaseQueue(path: "\(path)/\(dbName)") createTable()
} func createTable () {
let sql = "CREATE TABLE IF NOT EXISTS t_emotion ('id' integer NOT NULL,'png' text NOT NULL,'text' text NOT NULL,PRIMARY KEY('id'))"
dbQueue?.inDatabase({ (db) -> Void in
try! db.executeUpdate(sql, values: [])
})
} }

下面是FMDB模型类的代码,我们需要给模型添加一个属性,就在该类中添加。模型类需要实现 setValuesForKeysWithDictionary()方法,这一点和OC的用法有点像。除此之外,我们还需要有增加数据,删除数据,添加数据,查询数据的方法。我们将SQLite代码写在let sql = ""中,然后使用FMDB中的FMDBQueueManager来执行SQLite代码。所以使用FMDB框架我们可以更面向对象地来执行SQLite语句。

import UIKit

class FMDBModel: NSObject {

  ///属性
var png : String?
var text : String? init(dict : [String : AnyObject]) {
super.init()
setValuesForKeysWithDictionary(dict)
} override func setValue(value: AnyObject?, forUndefinedKey key: String) { } ///给一个插入
func insert(){ let sql = "INSERT INTO 't_emotion' ('png', 'text') values ('\(self.png!)', '\(self.text!)')"
///下面第一种写法存在线程不安全的问题
// try! FMDBManager.ShareManager.db?.executeUpdate(sql, values: []) ///下面的写法是线程安全的写法
FMDBQueueManager.shareFMDBQueueManager.dbQueue?.inDatabase({ (db) ->Void in try! db.executeUpdate(sql, values: [])
})
} func delete(){
let sql = ""
FMDBQueueManager.shareFMDBQueueManager.dbQueue?.inDatabase({ (db) -> Void in
try! db.executeUpdate(sql, values: [])
})
} func update(){
let sql = ""
FMDBQueueManager.shareFMDBQueueManager.dbQueue?.inDatabase({ (db) -> Void in
try! db.executeUpdate(sql, values: [])
})
} ///查询数据
class func query() -> [[String : AnyObject]]{ let sql = "SELECT * FROM t_emotion"
var resultArray: [[String : AnyObject]] = [] FMDBQueueManager.shareFMDBQueueManager.dbQueue?.inDatabase({ (db)->Void in ///执行查询
if let result = try? db.executeQuery(sql, values: []){
///简历查询后的数据
while result.next(){
///获取数据
let png = result.stringForColumn("png")
let text = result.stringForColumn("text")
let dict = ["png": png, "text": text]
resultArray.append(dict)
}
}
})
///查找到数据后将数据返回
return resultArray
}
}

上面是用swift语言来使用FMDB,使用OC来使用FMDB代码逻辑跟上面相同。使用swift主要是最近开发中使用到了swift语言,而且swift在排名上已经和OC不想上下,按照趋势,swift作为强语言替换掉OC弱语言应该是板上钉钉的事。如果swift入门了,使用起swift语言会比OC的代码更简单,逻辑也会更清晰。
下面是demo地址
demo地址

iOS开发--SQLite重要框架FMDB的使用的更多相关文章

  1. SQLite数据库框架--FMDB简单介绍

    1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 2.FMDB的优点 使用起来更加面向对象,省去了很多麻烦.冗余的C语言代码 对比 ...

  2. iOS 开发之照片框架详解(2)

    一. 概况 本文接着 iOS 开发之照片框架详解,侧重介绍在前文中简单介绍过的 PhotoKit 及其与 ALAssetLibrary 的差异,以及如何基于 PhotoKit 与 AlAssetLib ...

  3. iOS 开发之照片框架详解之二 —— PhotoKit 详解(下)

    本文链接:http://kayosite.com/ios-development-and-detail-of-photo-framework-part-three.html 这里接着前文<iOS ...

  4. iOS 开发之照片框架详解

    转载自:http://kayosite.com/ios-development-and-detail-of-photo-framework.html 一. 概要 在 iOS 设备中,照片和视频是相当重 ...

  5. iOS 开发之照片框架详解之二 —— PhotoKit 详解(上)

    转载自:http://kayosite.com/ios-development-and-detail-of-photo-framework-part-two.html 一. 概况 本文接着 iOS 开 ...

  6. ReactiveCocoa - iOS开发的新框架

    本文转载至 http://www.infoq.com/cn/articles/reactivecocoa-ios-new-develop-framework ReactiveCocoa(其简称为RAC ...

  7. iOS 开发之照片框架详解(1)

    http://kayosite.com/ios-development-and-detail-of-photo-framework.html/comment-page-1 一. 概要 在 iOS 设备 ...

  8. iOS开发常用第三方框架

    1.网络通信 1.ASIHTTPRequest 这是一个经典的老库,功能完全而强大,但已经停止更新很久了(iOS5.0停止更新,但是我最近看github上这个项目有新改动).在不同iOS版本上略微有一 ...

  9. ios开发——实战OC篇&FMDB详解

    FMDB详解 前一篇文章中我们介绍的SQLite的使用,在iOS中原生的SQLite API在使用上相当不友好. 于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.Plausibl ...

随机推荐

  1. 并发容器之写时拷贝的 List 和 Set

    对于一个对象来说,我们为了保证它的并发性,通常会选择使用声明式加锁方式交由我们的 Java 虚拟机来完成自动的加锁和释放锁的操作,例如我们的 synchronized.也会选择使用显式锁机制来主动的控 ...

  2. python利用scrapy框架爬取起点

    先上自己做完之后回顾细节和思路的东西,之后代码一起上. 1.Mongodb 建立一个叫QiDian的库,然后建立了一个叫Novelclass(小说类别表)Novelclass(可以把一级类别二级类别都 ...

  3. 史上最全常用正则表达式(Javascript公众号推文)

    2017-04-13 zxin JavaScript很多不太懂正则的朋友,在遇到需要用正则校验数据时,往往是在网上去找很久,结果找来的还是不很符合要求.所以我最近把开发中常用的一些正则表达式整理了一下 ...

  4. Windows下根据端口号查找进程并关闭

    经常用到,但是总记不住命令,备忘一下…… netstat -aon|findstr "8080"  找到进程号 tasklist|findstr "7200"  ...

  5. Docker理解

    近期一直在研究Docker,感悟颇深,和大家分享一下Docker 在云计算中的应用和Docker的原理. Docker 用法https://yeasy.gitbooks.io/docker_pract ...

  6. 前端测试框架Jest系列教程 -- Matchers(匹配器)

    写在前面: 匹配器(Matchers)是Jest中非常重要的一个概念,它可以提供很多种方式来让你去验证你所测试的返回值,本文重点介绍几种常用的Matcher,其他的可以通过官网api文档查看. 常用的 ...

  7. 51Nod1136--欧拉函数

    1136 欧拉函数 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目.此函数以其首名研究者欧拉命 ...

  8. 【NOIP2014提高组】飞扬的小鸟

    https://www.luogu.org/problem/show?pid=1941 从某一点开始飞直到飞出地图最少点击屏幕的次数,显然只和该点的坐标唯一相关,没有后效性,考虑用DP解.令f(i,j ...

  9. NOIP2016提高组初赛(2)四、读程序写结果3、求最长回文子序列

    #include <iostream> using namespace std; int lps(string seq, int i, int j) { int len1, len2; i ...

  10. TCP的十一种状态与三次握手分析(有图)

    我们知道TCP是面向连接的,我们只知道有连接断开,其实内部还有一些比较复杂的状态.去了解各个状态之间的切换有助于我们更加深入的了解TCP.下面我们就来分析各个状态. 1.如下图示(图源百度)图中显示出 ...