什么是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. 【Java框架型项目从入门到装逼】第三节 - 如何用Tomcat发布web项目?

    啥叫Tomcat?有道词典是这么说的. 这个我们姑且不管,实际上呢,Tomcat是一种Web服务器,我们自己做好了一个Web项目,就可以通过Tomcat来发布.服务器呢,又分为硬件服务器和软件服务器. ...

  2. 高性能分布式执行框架——Ray

    Ray是UC Berkeley AMP实验室新推出的高性能分布式执行框架,它使用了和传统分布式计算系统不一样的架构和对分布式计算的抽象方式,具有比Spark更优异的计算性能. Ray目前还处于实验室阶 ...

  3. P1457 城堡 The Castle

    轻度中毒 原题 :The Castle 以下为题解部分:明明辣么简单的一道题,硬是搞了1.5h,WTF?以下列出本题的一些要点. 搜索(DFS)嘛,染色嘛,统计大小嘛,很容易想,也很更易处理. 接下来 ...

  4. SpringCloud接入EDAS——服务发现篇

    旁白 很久没有写技术文章了,最近不是写水文就是写小说.说到底,还是最近很少研究技术的缘故,已经到了江郎才尽的地步了. 不过,LZ无意间看到自己团队的小伙伴写的一些文章,觉得还是不错的,于是便动了心思, ...

  5. memcached一致性哈希及php客户端实现

    1.memcached分布式算法 memcached的分布式是依靠客户端的算法来实现,假设键名为$key,服务器数量为N,常规的实现方式有两种: 取模哈希 crc32($key)%N,通过这个算法将键 ...

  6. Less的!important关键字

    Less的!important关键字 在调用 mixin 时,如果在后面追加 !important 关键字,就可以将 mixin 里面的所有属性都标记为 !important.如,以下Less代码: ...

  7. PE文件格式分析

    PE文件格式分析 PE 的意思是 Portable Executable(可移植的执行体).它是 Win32环境自身所带的执行文件格式.它的一些特性继承自Unix的Coff(common object ...

  8. npm常用命令整理

    npm是一个NodeJS包管理跟分发工具,已经成为了非官方的发布node模块(包)的标准.它可以帮助我们解决代码部署上的一些问题,将开发者从繁琐的包管理工作中(版本.依赖等)解放出来,更加专注于功能上 ...

  9. php接入支付宝的流程

    php接入支付宝的流程写在这里供像我一样的小白参考. 1.首先要有一个创建一个应用(选好自己想要的功能,关于支付的功能,貌似都需要签约) 2.下载SDK&Dome(网址https://doc. ...

  10. 如何用九条命令在一分钟内检查Linux服务器性能?

    一.uptime命令 这个命令可以快速查看机器的负载情况.在Linux系统中,这些数据表示等待CPU资源的进程和阻塞在不可中断IO进程(进程状态为D)的数量.这些数据可以让我们对系统资源使用有一个宏观 ...