FMDB是一套OC语言,面向对象,基于SQLite,轻量级的数据存储API,
因其操作简单,避免了SQLite复杂的C语言编程,被广泛应用。
FMDB的github地址:
https://github.com/ccgus/fmdb
CocoaPods 安装:
pod 'FMDB'
手动安装:
将FMDB文件夹直接拖到工程内
由于FMDB是基于SQLite的,所以需手动导入 libsqlite3.0.tbd 框架
FMDB的优点
- 面向对象,省去了很多麻烦、冗余的C语言代码
- 对比苹果自带的Core Data框架,更加轻量级和灵活
- 提供了多线程安全的数据库操作方法,有效地防止数据混乱
FMDB有三个主要的类
FMDatabase
- 一个FMDatabase对象就代表一个单独的SQLite数据库,用来执行SQL语句
FMResultSet
- 使用FMDatabase执行查询后的结果集
FMDatabaseQueue
- 用于在多线程中执行多个查询或更新,它是线程安全的
在FMDB中,除查询以外的所有操作,都称为“更新”
使用executeUpdate:方法执行更新
- (BOOL)executeUpdate:(NSString*)sql, …
- (BOOL)executeUpdateWithFormat:(NSString*)format, …
- (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments
查询方法
- (FMResultSet )executeQuery:(NSString)sql, …
- (FMResultSet )executeQueryWithFormat:(NSString)format, …
- (FMResultSet )executeQuery:(NSString )sql withArgumentsInArray:(NSArray *)arguments
// 查询数据
FMResultSet *rs = [db executeQuery:@"SELECT * FROM t_person"];
// 遍历结果集
while ([rs next]) {
NSString *name = [rs stringForColumn:@"name"];
int age = [rs intForColumn:@"age"];
double height = [rs doubleForColumn:@"height"];
}
FMDatabase这个类是线程不安全的,如果在多个线程中同时使用一个FMDatabase实例,会造成数据混乱等问题
为了保证线程安全,FMDB提供方便快捷的FMDatabaseQueue类
FMDatabaseQueue的创建
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:path];
简单使用
[queue inDatabase:^(FMDatabase *db) {
[db executeUpdate:@"INSERT INTO t_person(name) VALUES (?)", @"Aria"];
[db executeUpdate:@"INSERT INTO t_person(name) VALUES (?)", @"Alice"];
[db executeUpdate:@"INSERT INTO t_person(name) VALUES (?)", @"Maya"];
FMResultSet *rs = [db executeQuery:@"select * from t_person"];
while ([rs next]) {
// …
}
}];
举例说明
// 获取存储路径
NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
// 拼接存储路径
NSString *dataPath = [docPath stringByAppendingPathComponent:@"kids.sqlite"];
// 初始化 FMDatabase
FMDatabase *db = [FMDatabase databaseWithPath:dataPath];
// 打开数据库
[db open];
// 创建表格
[db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_kids (id integer PRIMARY KEY, name TEXT NOT NULL,sex text,age INTEGER,height REAL)"];
// 添加数据
[db executeUpdateWithFormat:@"INSERT INTO t_kids (name,sex,age,height) VALUES (%@,%@,%ld,%f)",'Vivian','female',18,165.0];
// 通过单一属性删除数据
[_db executeUpdate:@"DELETE FROM t_kids where name = ?",'Nora'];
// 删除所有数据
[_db executeUpdate:@"DELETE FROM t_kids"];
// 查询单个数据
FMResultSet *set = [_db executeQuery:@"SELECT *FROM t_kids where name = ?;",'Lily'];
while (set.next) {
NSString *name = [set stringForColumn:@"name"];
NSString *sex = [set stringForColumn:@"sex"];
NSInteger age = [set intForColumn:@"age"];
double height = [set doubleForColumn:@"height"];
}
// 查询所有数据
FMResultSet *set = [_db executeQuery:@"SELECT *FROM t_kids;"];
while (set.next) {
...
}
从FMResultSet中取值的主要方法:
intForColumn: //整型
longLongIntForColumn: //长整型
boolForColumn: //布尔
doubleForColumn://浮点型
stringForColumn:// 字符型
dateForColumn: // 日期
dataForColumn: // 二进制
objectForColumnName: // 对象