iOS---SQLite数据库框架之FMDB -Swift
SQLite数据库框架之FMDB
什么是FMDB?
FMDB是iOS平台的SQLite数据库框架,FMDB以OC的方式封装了SQLite的C语言API。对比苹果自带的Core Data框架,更加轻量级和灵活,使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码。并且FMDB提供了多线程安全的数据库操作方法,能有效地防止数据混乱。
如何集成FMDB?
这里我只写swift中的集成方式,Objective-C类似,只是不需要添加Swift extensions和桥接。
GitHub地址:https://github.com/ccgus/fmdb
方式一:
下载后将fmdb-master/src/fmdb和fmdb-master/src/extra/Swift extensions拖入项目中,添加系统库文件libsqlite3.tbd。如下图所示:
方式二:
通过CocoaPods添加,但是不推荐这种方式,因为这不是官方的。
1
2
|
use_frameworks!
pod 'FMDB', :git => 'https://github.com/robertmryan/fmdb.git'
|
FMDB核心类
FMDatabase: 一个FMDatabase表示一个sqlite数据库,所有对数据库的操作都是通过这个类。
executeStatements
: 执行多条sql。
executeQuery
: 执行查询语句。
executeUpdate
: 执行除查询以外的语句,create, drop, insert, delete, update。
FMDatabaseQueue: 内部封装FMDatabase和串行queue,用于多线程操作数据库,并且提供事务,建议使用这个。
inDatabase
: 参数是一个闭包,在闭包里面可以获得FMDatabase对象。
inTransaction
: 使用事务。
FMResultSet: 查询的结果集。
通过字段名称获取字段值。
如何使用FMDB?
一、创建表
使用FMDB和使用AFNetworking类似,最好单独创建一个工具类,使用单例进行数据库操作。
新建JFSQLiteManager类,继承NSObject。在这个类中重写构造方法创建FMDatabaseQueue对象,并创建一张数据表JF_Person。表中有4个字段,分别是id(主键)、name、age、height。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
import UIKit
class JFSQLiteManager: NSObject {
/// 创建单例
static let shareManager = JFSQLiteManager()
/// 数据库名称
private let dbName = "person.db"
/// FMDatabaseQueue对象,用于操作数据库
let dbQueue: FMDatabaseQueue
// 构造方法
override init() {
// 获取沙盒路径
let documentPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last!
// 拼接数据库完整路径
let dbPath = (documentPath as NSString).stringByAppendingPathComponent(dbName)
// 创建FMDatabaseQueue对象,会自动打开数据库,并创建一个串行队列
dbQueue = FMDatabaseQueue(path: dbPath)
super.init()
// 创建数据表
createTable("JF_Person")
}
// 创建数据表 - parameter tbName: 表名
private func createTable(tbName: String) {
// sql语句
let sql = "CREATE TABLE IF NOT EXISTS \(tbName) ( \n" +
"id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, \n" +
"name TEXT, \n" +
"age INTEGER, \n" +
"height REAL \n" +
");"
// db表示一个数据库
dbQueue.inDatabase { (db) -> Void in
// 执行sql语句,创建一张表。返回Bool类型是否创建成功
if db.executeUpdate(sql) {
print("建表成功")
} else {
print("建表失败")
}
}
}
}
|
然后在AppDelegate中调用这个单例,测试我们的代码
1
|
JFSQLiteManager.shareManager
|
显示 建表成功!
二、删除表
在JFSQLiteManager类中实现删除表的方法,删除指定表名的数据表。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
// 删除指定数据库 - parameter tbName: 表名
func dropTable(tbName: String) {
// sql语句
let sql = "DROP TABLE \(tbName);"
// db表示一个数据库
dbQueue.inDatabase { (db) -> Void in
// 执行sql语句,创建一张表。返回Bool类型是否创建成功
if db.executeUpdate(sql) {
print("删除表成功")
} else {
print("删除表失败")
}
}
}
|
然后在AppDelegate中调用这个方法,测试我们的代码
1
|
JFSQLiteManager.shareManager.dropTable("JF_Person")
|
显示 删除表成功!
三、增加数据
在JFSQLiteManager类中实现添加数据的方法,插入一条测试数据。这里只是测试学习,所以SQL语句就直接写死了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
// 添加数据
func insertData() {
// sql语句
let sql = "INSERT INTO JF_Person (name, age, height) VALUES (?, ?, ?);"
JFSQLiteManager.shareManager.dbQueue.inDatabase { (db) -> Void in
if db.executeUpdate(sql, "7ag", 23, 1.95) {
print("插入数据成功")
// 获取插入数据的主键
let id = db.lastInsertRowId()
print("插入数据的id: \(id)")
}
}
}
|
然后在AppDelegate中调用这个方法,测试我们的代码
1
|
JFSQLiteManager.shareManager.insertData()
|
显示 插入数据成功 插入数据的id: 1!
四、删除数据
在JFSQLiteManager类中实现删除数据的方法,删除id = 1的数据。这里只是测试学习,所以SQL语句就直接写死了。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
// 删除数据
func deleteData() {
// sql语句
let sql = "DELETE FROM JF_Person WHERE id = 1;"
JFSQLiteManager.shareManager.dbQueue.inDatabase { (db) -> Void in
if db.executeUpdate(sql) {
print("删除数据成功")
}
}
}
|
然后在AppDelegate中调用这个方法,测试我们的代码
1
|
JFSQLiteManager.shareManager.deleteData()
|
显示 删除数据成功!
五、修改数据
上面一步我们把添加的数据给删除,所以我们需要再次调用添加数据的方法,添加一条数据以供我们学习测试使用。
在JFSQLiteManager类中实现更新数据的方法,更新id = 1的数据。这里只是测试学习,所以SQL语句就直接写死了。
1
2
3
4
5
6
7
8
9
10
11
12
|
// 更新数据
func updateData() {
// sql
let sql = "UPDATE JF_Person SET name = '6ag', age = 24, height = 1.92 WHERE id = 1;"
JFSQLiteManager.shareManager.dbQueue.inDatabase { (db) -> Void in
if db.executeUpdate(sql) {
print("更新数据成功")
}
}
}
|
然后在AppDelegate中调用这个方法,测试我们的代码
1
|
JFSQLiteManager.shareManager.updateData()
|
显示 更新数据成功 !
六、查找数据
上面增、删、改中,我们执行sql语句的方法都是使用executeUpdate。但是查找数据,我们就必须使用executeQuery了。其实不管是神马操作,改变的基本都是SQL语句而已。这一点比起C语言的sqlite API来说,简直是太方便了。如果对于SQL语句不是很熟悉也没关系,在下已经为各位大神准备好了常用SQL语句:http://blog.6ag.cn/1227.html
在JFSQLiteManager类中实现更新数据的方法,查询JF_Person表中所有记录的id,name,age,height字段的值。这里只是测试学习,所以SQL语句就直接写死了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
// 查询数据
func queryData() {
// sql
let sql = "SELECT id, name, age, height FROM JF_Person;"
JFSQLiteManager.shareManager.dbQueue.inDatabase { (db) -> Void in
guard let result = db.executeQuery(sql) else {
print("没有查询到数据")
return
}
// 获取查询结果
// next() 表示获取一条记录, 返回true表示获取到记录,false表示没有记录。所以我们使用循环来获取所有查询到的数据
while result.next() {
let id = result.intForColumn("id")
let name = result.stringForColumn("name")
let age = result.intForColumn("age")
let height = result.doubleForColumn("height")
// 打印出查询到的数据
print("id: \(id), name: \(name), age: \(age), height: \(height)")
print("------------")
}
}
}
|
然后在AppDelegate中调用这个方法,测试我们的代码
1
|
JFSQLiteManager.shareManager.queryData()
|
打印出
id: 1, name: 6ag, age: 24, height: 1.92
------------
iOS---SQLite数据库框架之FMDB -Swift的更多相关文章
- FMDB是iOS平台的SQLite数据库框架
1.FMDB简介 什么是FMDBFMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 为什么使用FMDB使用起来更加面向对象,省去了很多麻烦.冗余的C语言 ...
- SQLite数据库框架--FMDB简单介绍
1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 2.FMDB的优点 使用起来更加面向对象,省去了很多麻烦.冗余的C语言代码 对比 ...
- iOS sqlite数据库实现(转)
转载自:http://www.cnblogs.com/macroxu-1982/archive/2012/10/01/2709960.html 1 实现过程添加libsqlite3组件 选择项目后,在 ...
- iOS - SQLite 数据库存储
1.SQLite 数据库 SQLite 是一种轻型的嵌入式数据库,安卓和 iOS 开发使用的都是 SQLite 数据库.它占用资源非常低,在嵌入式设备中,可能需要几百 K 的内存数据就够了.他的处理速 ...
- 【转】iOS - SQLite 数据库存储
本文目录 1.SQLite 数据库 2.iOS 自带 SQLite 的使用 3.fmdb 的使用 4.fmdb 多线程操作 5.其他 SQLite 的第三方封装库 回到顶部 1.SQLite 数据库 ...
- SQlite数据库框架:LitePal
常用的数据库框架Android的发展的速度是难以置信的,Android出来哪一年我还在小学上学很,还能很清楚的记得,那年一切,但是那个时候的我怎么可能也不会想到自己将来会要去做Android.Andr ...
- iOS: sqlite数据库的基本操作
介绍: sqlite3(3是版本)是本地系统中的一个小型数据库,因为它没有在数据维护和安全上做过多的操作,所以它存储处理数据时,非常简单方便,但是它是不安全和不可靠的,如果一旦误操作删除了数据,是没有 ...
- iOS sqlite数据库图像化查看
问题描述:在xocde上用sqlite数据库的时候,因为没有图形化界面,有些时候很难看出自己设计的数据库是否有问题,比如我刚上手sqlite数据库设计id为自增长时,很自然的用了identify(1, ...
- IOS sqlite数据库增删改查
1.简单介绍 简单封装sqlite数据库操作类 BaseDB 用于完毕对sqlite的增删改查.使用前先导入libsqlite3.0.dylib库 2.BaseDB.h // // BaseDB.h ...
随机推荐
- Abstract Factory(抽象工厂)模式
1.意图 提供一个创建一系列相关或相互依赖对象的接口,而无需制定它们具体的类. 2.适用性 一个系统要独立于它的产品创建.组合和表示时. 一个系统要由多个产品系列中的一个来配置时. 当你强调一系列相关 ...
- The content of element type "configuration" must match "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProv
在mybatis配置文件config.xml中报错: The content of element type "configuration" must match "(p ...
- [原创][LaTex]LaTex学习笔记之框架及宏包
0. 简介 LaTex在书写文档时的最基本单元就是首部的写作,变相的也可以说是头文件.本文章就来总结一下文档的基本格式和常用宏包. 1. 基本单元 基本单元需要对LaTex语法有一定的了解,这个很简单 ...
- Selenium2+python自动化24-js处理富文本(带iframe)
前言 上一篇Selenium2+python自动化23-富文本(自动发帖)解决了富文本上iframe问题,其实没什么特别之处,主要是iframe的切换,本篇讲解通过js的方法处理富文本上iframe的 ...
- 退役?OR 继续
今天突然想了好多.上次CB那么决绝的退役,还有其他的一些东西.觉得大家说的都挺对的.看待问题的方式不同,然后或多或少就变了.预备役的事情就是想能不能不让大家因为上不了场退役. 想起以前的自己那么坚决的 ...
- swift 如何获取webView的内容高度
应用中如果使用webView,要想获取其内容高度,就要实现其代理方法, 首先添加代理UIWebViewDelegate 然后给代理赋值 webView.delegate = self 实现代理方法: ...
- ajax 调用 JSON.parse();
$.ajax({ type : "POST", data:{ createStartTime:createStartT ...
- java核心知识点学习----创建线程的第三种方式Callable和Future CompletionService
前面已经指出通过实现Runnable时,Thread类的作用就是将run()方法包装成线程执行体,那么是否可以直接把任意方法都包装成线程执行体呢?Java目前不行,但其模仿者C#中是可以的. Call ...
- js获取文件大小
var file = urlBox.doc.activeElement.files[0]||urlBox.files[0] ; if (file) { var fileSize = 0; if (fi ...
- 【洛谷P3258】松鼠的新家
很好的一道题 LCA+树上前缀和 sum数组是前缀和数组, 分类讨论一下, 1.访问到一个点p1,若下一个点p2需要往儿子下面找的话,那么lca就是这个点p1,则sum[p1]--; sum[p2]+ ...