什么是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. 解决:org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Error evaluating expression 'requestMap.maintenancename != null and requestMap.maintenance

    异常如下:org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.Builde ...

  2. better-scroll 实现tab栏目滑动当前高亮始终在可视区

    https://ustbhuangyi.github.io/better-scroll/doc/zh-hans/#better-scroll better-scroll文档地址 如图 ,是我们要实现的 ...

  3. TFboy养成记 多层感知器 MLP

    内容总结与莫烦的视频. 这里多层感知器代码写的是一个简单的三层神经网络,输入层,隐藏层,输出层.代码的目的是你和一个二次曲线.同时,为了保证数据的自然,添加了mean为0,steddv为0.05的噪声 ...

  4. CSS-笔记1-选择器与文本元素

    知识点一: CSS概念:CSS 指层叠样式表 (Cascading Style Sheets)(级联样式表) Css是用来美化html标签的,相当于页面化妆. 知识点二: 选择器格式与部分属性: 写法 ...

  5. C# 通过url地址获取页面内容

    using System.Net; using System.IO; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(" ...

  6. webpack 1.x 学习总结

    webpack介绍(from github): A bundler for javascript and friends. Packs many modules into a few bundled ...

  7. 用lua+redis实现一个简单的计数器功能 (一)

    首先安装环境 依赖环境有 luajit http://luajit.org ngx_devel_kit https://github.com/simpl/ngx_devel_kit echo-ngin ...

  8. HDU 1317XYZZY spfa+判断正环+链式前向星(感觉不对,但能A)

    XYZZY Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  9. vue.js初学,笔记1,安装

    最近学习vue.js,下面是笔记: 说明:因为npm安装插件是从国外服务器下载,受网络影响大,可能出现异常,如果npm的服务器在中国就好了,所以我们乐于分享的淘宝团队干了这事.来自官网:"这 ...

  10. 用 Label 控制 Service 的位置 - 每天5分钟玩转 Docker 容器技术(106)

    上一节我们讨论了 Service 部署的两种模式:global mode 和 replicated mode.无论采用 global mode 还是 replicated mode,副本运行在哪些节点 ...