将 CocoaPods 安装后,按照 CocoaPods 的使用说明就可以将 FMDB 第三方集成到工程中,具体请看博客iOS学习46之第三方CocoaPods的安装和使用(通用方法)
1. FMDB简介
1> 概述
-
iOS 中原生的 SQLite API 在进行数据存储的时候,需要使用 C语言 中的函数,操作比较繁琐。于是,就出现了一系列将SQLite API 进行封装的库,例如 FMDB、PlausibleDatabase、SQLitePersistentObjects 等。
-
FMDB 是一款简洁、易用的封装库。因此,在这里推荐使用第三方框架 FMDB,它是对 libsqlite3 框架的封装,用起来的步骤与 SQLite 使用类似,并且它对于多线程的并发操作进行了处理,所以是线程安全的。
2> FMDB优缺点
对多线程的并发操作进行处理,所以是线程安全的;
以OC的方式封装了SQLite的C语言API,使用起来更加的方便;
FMDB是轻量级的框架,使用灵活。
因为它是OC的语言封装的,只能在iOS开发的时候使用,所以在实现跨平台操作的时候存在局限性。
3> FMDB中重要的类
- FMDatabaseQueue:用于在多线程中执行多个查询或更新,它是线程安全的。
4> FMDB使用步骤
-
第一步:使用 CocoaPods 将第三方集成到工程项目中
-
第二步:导入 libsqlite3.0 框架,导入头文件 FMDatabase.h
-
第三步:代码实现,与 SQLite 使用步骤相似,创建数据库路径,获得数据库路径,打开数据库,然后对数据库进行增、删、改、查操作,最后关闭数据库。
2. FMDB创建数据库和数据表
创建FMDatabase对象时参数为SQLite数据库文件路径,该路径可以是以下三种方式之一:
① 文件路径。该文件路径无需真实存在,如果不存在会自动创建;
② 空字符串(@"")。表示会在临时目录创建一个空的数据库,当 FMDatabase 连接关闭时,文件也会被删除;
③ NULL。将创建一个内在数据库,同样的,当 FMDatabase 连接关闭时,数据将会被销毁。
我们一般采用第一种方式来获得数据库文件的路径,具体实例代码如下:
NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
self.filePath = [documentPath stringByAppendingPathComponent:@"student.sqlite"];
NSLog(@"filePath = %@", self.filePath);
使用的初始化方法:
+ (instancetype)databaseWithPath:(NSString*)aPath
实例代码:
// 第四步:使用路径初始化FMDB对象
self.database = [FMDatabase databaseWithPath:self.filePath];
如果权限不足或者资源不足,则无法打开和创建数据库。
// 需要判断数据库打开的时候才进行执行语句
if (self.database.open) {
// 创建表
}
使用的执行SQL语句的方法:
- (BOOL)executeUpdate:(NSString*)sql, ...
该方法的返回值是一个BOOL值,我们可以根据返回值,来判断SQL语句是否执行成功。
实例代码:
if (self.database.open) {
// 建表语句
NSString *createSql = @"create table if not exists t_student(id integer primary key autoincrement not null, name text not null, age integer not null, sax text not null)";
// 执行建表语句,创建数据表
BOOL result = [self.database executeUpdate:createSql];
// 判断是否建表成功
if (result) {
NSLog(@"创表成功");
} else {
NSLog(@"创表失败");
}
}
实例代码:
// 第五步:关闭数据库
[self.database close];
3. FMDB实现增、删、改、查
1> FMDB—执行更新
一切不是SELECT命令的命令都视为更新。这包括CREAT,UPDATE,INSERT,ALTER,BEGIN,COMMIT,DETACH,DELETE,DROP,END,EXPLAIN,VACUUM,REPLACE等。
简单来说,只要不是以 SELECT 开头的命令都是更新命令。
执行更新返回一个BOOL值。YES表示执行成功,否则表示有错误。你可以调用 -lastErrorMessage 和 -lastErrorCode方法来得到更多信息。
2> 执行更新命令的相关方法
- executeUpdate: 不确定的参数用 ? 来占位(后面参数必须是 OC 对象,;代表语句结束,也可以不写)
增、删、改的代码实例:
// 增加(插入)数据
BOOL result = [self.database executeUpdate:@"insert into t_student(name, age, sax) values(?, ?, ?)", @"xiaoming", @12, @"男"];
// 更新数据
BOOL result = [self.database executeUpdate:@"update t_student set name = ? where name = ?", @"xiaoming", @"小明"];
// 删除数据
BOOL result = [self.database executeUpdate:@"delete from t_student where name = ?", @"xiaoming"];
- executeUpdateWithFormat:不确定的参数用%@,%d等来占位 (参数为原始数据类型,执行语句不区分大小写)
增、删、改的代码实例: