iOS数据库FMDB的简单使用
一、FMDB基本使用
1、什么是FMDB?
FMDB是一款简洁、易用的封装库。因此,在这里推荐使用第三方框架FMDB,它是对libsqlite3框架的封装,用起来的步骤与SQLite使用类似,并且它对于多线程的并发操作进行了处理,所以是线程安全的。
2、FMDB的优缺点?
优点:
对多线程的并发操作进行处理,所以是线程安全的;
以OC的方式封装了SQLite的C语言API,使用起来更加的方便;
FMDB是轻量级的框架,使用灵活。
缺点:
因为它是OC的语言封装的,只能在ios开发的时候使用,所以在实现跨平台操作的时候存在局限性。
3、FMDB的安装方式?
可以用CocoaPod安装,pod 'FMDB',也可以手动下载导入,GitHub链接: https://github.com/ccgus/fmdb,然后导入系统依赖库sqlite3.0.tbd。
4、FMDB核心类
FMDatabase数据库,一个FMDatabase对象就代表一个单独的SQLite数据库用来执行SQL语句。
FMResultSet查询结果集,使用FMDatabase执行查询后的结果集。
FMDatabaseQueue线程安全数据库操作,用于在多线程中执行多个查询或更新,它是线程安全的。
5、FMDB使用步骤
打开数据库,通过指定SQLite数据库文件路径来创建FMDatabase对象,指定具体文件路径时,如果不存在会自动创建;为空字符串@""时,会在临时目录创建一个空的数据库当FMDatabase连接关闭时,数据库文件也被删除;为nil时,会创建一个内存中临时数据库,当FMDatabase连接关闭时,数据库会被销毁。
打开数据库:
FMDatabase *db = [FMDatabase databaseWithPath:path];
if ([db open]) { NSLog(@"打开成功!"); }
执行更新:
在FMDB中,除查询以外的所有操作,都称为“更新”
create、drop、insert、update、delete等
使用executeUpdate:方法执行更新
// FMDB更新方法
-(BOOL)executeUpdate:(NSString)sql, ...
-(BOOL)executeUpdateWithFormat:(NSString)format, ...
-(BOOL)executeUpdate:(NSString)sql withArgumentsInArray:(NSArray )arguments
更新示例:
[db executeUpdate:@"UPDATE t_student SET age = ? WHERE name = ?;", @20, @"Jack"]
执行查询:
- (FMResultSet *)executeQuery:(NSString*)sql, ...
- (FMResultSet *)executeQueryWithFormat:(NSString*)format, ...
- (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments
执行查询示例:
// 查询数据
FMResultSet *rs = [db executeQuery:@"SELECT * FROM t_student"];
// 遍历结果集
while ([rs next]) {
NSString *name = [rs stringForColumn:@"name"];
int age = [rs intForColumn:@"age"];
double score = [rs doubleForColumn:@"score"];
}
关闭数据库:
[self.db close];
二、FMDabaseQueue的简单使用
1、FMDabaseQueue简介
FMDatabase这个类是线程不安全的,如果在多个线程中同时使用一个FMDatabase实例,会造成数据混乱等问题,为了保证线程安全,FMDB提供方便快捷的FMDatabaseQueue类。
2、FMDabaseQueue的使用
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:path];
简单使用
[queue inDatabase:^(FMDatabase *db) {
[db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jack"];
// 查询
FMResultSet *rs = [db executeQuery:@"select * from t_student"];
}];
使用事务
[queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
[db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jack"];
//查询
FMResultSet *rs = [db executeQuery:@"select * from t_student"];
}];
三、FMDB FMDatabase类的简单使用
1、手动集成FMDB步骤
下载FMDB GitHub链接: https://github.com/ccgus/fmdb,将FMDB框架文件夹拖入工程,添加系统依赖库sqlite3.0.tbd,导入FMDB.h头文件,编译成功,集成FMDB完成。
2、创建数据库和数据表基本步骤
(1)拼接数据库存储的沙盒路径
(2)通过路径创建数据库
(3)打开数据库
如果成功打开数据库后,创建数据表。
创建数据库和数据表参考代码:
- (void)viewDidLoad {
[super viewDidLoad];
// 0.拼接数据库存放的沙盒路径
NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
NSString *sqlFilePath = [path stringByAppendingPathComponent:@"student.sqlite"];
// 1.通过路径创建数据库
self.db = [FMDatabase databaseWithPath:sqlFilePath];
// 2.打开数据库
if ([self.db open]) {
NSLog(@"打开成功");
BOOL success = [self.db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER DEFAULT 1)"];
if (success) {
NSLog(@"创建表成功");
} else {
NSLog(@"创建表失败");
}
} else {
NSLog(@"打开失败");
}
}
3、FMDatabase数据库的增删改查
// 1.插入数据
static NSInteger age = 10;
age++;
BOOL success = [self.db executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?, ?);", @"jack", @(age)];
if (success) {
NSLog(@"插入成功");
} else {
NSLog(@"插入失败");
}
// 2.删除数据
BOOL success = [self.db executeUpdate:@"DELETE FROM t_student WHERE age > 20 AND age < 25;"];
// 3.修改数据
BOOL success = [self.db executeUpdate:@"UPDATE t_student SET name = 'liwx' WHERE age > 12 AND age < 15;"];
// 4.查询数据
FMResultSet *result = [self.db executeQuery:@"SELECT id, name, age FROM t_student WHERE age > 25;"];
while ([result next]) {
int ID = [result intForColumnIndex:0];
NSString *name = [result stringForColumnIndex:1];
int age = [result intForColumn:@"age"];
NSLog(@"ID: %zd, name: %@, age: %zd", ID, name, age);
}
四、FMDatabaseQueue数据库队列基本使用
使用FMDatabaseQueue类在多线程中执行多个查询或更新是线程安全的。
1、使用FMDatabaseQueue创建数据库
(1)创建一个FMDatabaseQueue对象
只要成功创建数据库队列对象,FMDB内部就会自动给我们加载数据库对象,无需再执行打开数据库操作。
(2)使用block传递数据库
使用 inDatabase:方法传递数据库对象。
(3)使用SQL语句创建数据表
- (void)viewDidLoad {
[super viewDidLoad];
// 0.拼接数据库存放的沙盒路径
NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
NSString *sqlFilePath = [path stringByAppendingPathComponent:@"student.sqlite"];
// 1.创建一个FMDatabaseQueue对象
// 只要创建数据库队列对象, FMDB内部就会自动给我们加载数据库对象
// 2.执行操作
// 会通过block传递队列中创建好的数据库
[self.dbQueue inDatabase:^(FMDatabase *db) {
BOOL success = [db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER DEFAULT 1);"];
if (success) {
NSLog(@"创建表成功");
} else {
NSLog(@"创建表失败");
}
}];
}
2、FMDatabaseQueue队列数据库的增删改查
(1)插入数据
- (IBAction)insertClick {
static NSInteger age = 10;
age++;
[self.dbQueue inDatabase:^(FMDatabase *db) {
BOOL success = [db executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?, ?);", @"jack", @(age)];
if (success) {
NSLog(@"插入成功");
} else {
NSLog(@"插入失败");
}
}];
}
(2)删除数据
// 删除数据
[self.dbQueue inDatabase:^(FMDatabase *db) {
BOOL success = [db executeUpdate:@"DELETE FROM t_student WHERE age > 20 AND age < 25;"];
// 判断是否SQL是否执行成功
// ...
}
(3)修改数据
// 修改数据
[self.dbQueue inDatabase:^(FMDatabase *db) {
BOOL success = [db executeUpdate:@"UPDATE t_student SET name = 'liwx' WHERE age > 12 AND age < 15;"];
// 判断是否SQL是否执行成功
// ...
}
(4)查询数据
// 查询数据
- (IBAction)queryClick {
[self.dbQueue inDatabase:^(FMDatabase *db) {
FMResultSet *result = [db executeQuery:@"SELECT id, name, age FROM t_student WHERE age > 25;"];
while ([result next]) {
int ID = [result intForColumnIndex:0];
NSString *name = [result stringForColumnIndex:1];
int age = [result intForColumn:@"age"];
NSLog(@"ID: %zd, name: %@, age: %zd", ID, name, age);
}
}];
}