什么是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. Python 日志处理(二) 使用正则表达式处理Nginx 日志

    使用正则表达式来处理Nginx 日志 一. 先对单行的日志进行分组正则匹配,返回匹配后的结果(字典格式): from datetime import datetime import re #单行日志 ...

  2. lumen 中间件详解

    我来给大家,讲解一下lumen中的中间件,高手勿喷. 首先,我们看下lumen中文档中的写法,我这里看的是5.3中文文档.https://lumen.laravel-china.org/docs/5. ...

  3. JAVA提高十八:Vector&Stack深入分析

    前面我们已经接触过几种数据结构了,有数组.链表.Hash表.红黑树(二叉查询树),今天再来看另外一种数据结构:栈. 什么是栈呢,我们先看一个例子:栈就相当于一个很窄的木桶,我们往木桶里放东西,往外拿东 ...

  4. [Machine Learning]学习笔记-Neural Networks

    引子 对于一个特征数比较大的非线性分类问题,如果采用先前的回归算法,需要很多相关量和高阶量作为输入,算法的时间复杂度就会很大,还有可能会产生过拟合问题,如下图: 这时就可以选择采用神经网络算法. 神经 ...

  5. springboot学习(二)——springmvc配置使用

    以下内容,如有问题,烦请指出,谢谢 上一篇讲解了springboot的helloworld部分,这一篇开始讲解如何使用springboot进行实际的应用开发,基本上寻着spring应用的路子来讲,从s ...

  6. JavaScript实现动画效果

    说到JavaScript实现动画效果,不得不想到两个函数,setTimeout和setInterval. setTimeout的常用的使用方法为 setTimeout(callback, delay) ...

  7. ShoneSharp语言(S#)的设计和使用介绍系列(4)— 入门概述

    ShoneSharp语言(S#)的设计和使用介绍 系列(4)- 入门概述 作者:Shone 声明:原创文章欢迎转载,但请注明出处,https://www.cnblogs.com/ShoneSharp. ...

  8. javascript语言基础

    js的基本语法 /* 多行注释 * */ //单行注释 // 变量赋值 默认以换行符作为结束符,有分号以分号作为结束符号 var i; i=10; s="hello"; var b ...

  9. 揭秘 HashMap 实现原理(Java 8)

    HashMap 作为一种容器类型,无论你是否了解过其内部的实现原理,它的大名已经频频出现在各种互联网面试中了.从基本的使用角度来说,它很简单,但从其内部的实现来看(尤其是 Java 8 的改进以来), ...

  10. Scala入门系列(一):基础语法

    Scala基础语法 Scala与JAVA的关系 Scala是基于Java虚拟机,也就是JVM的一门编程语言,所有Scala的代码都需要经过编译为字节码,然后交由Java虚拟机来运行. 所以Scala和 ...