- FMDB简介
什么是FMDB?
FMDB是iOS平台的SQLite数据库框架
FMDB以OC的方式封装了SQLite的C语言API
FMDB的优点?
使用起来更加面向对象,省去了很多麻烦、冗余的代码
对比苹果自带的CoreData框架,更加轻量级和灵活
提供了多线程安全的数据库操作方法,有效地方志数据混乱。
FMDB的github托管地址:https://github.com/ccgus/fmdb
- FMDatabase对象
FMDatebase对象:代表一个独立的SQLite数据库
数据库的打开/创建:
FMDatebase *db = [FMDatabase databaseWithPath:path]; if ( ![db open] ) { NSLog(@"数据库打开失败!"); }
文件路径的三种情况说明:
a. 具体的文件名:如果不存在会创建
b. 空字符串@”” :临时目录创建一个空的,当FMDatabase连接关闭时删除
c. 会在内存中创建一个临时数据库,当FMDatabase连接关闭时删除
数据库关闭
- (BOOL)close
- FMDatabaseQueue对象
FMDatabase这个类是线程不安全的,如果在多个线程中同时使用一个FMDatabase实例,可能会造成数据混乱的问题。
为了保证线程安全,FMDB提供方便快捷的FMDatabaseQueue类。
FMDatabaseQueue对象的创建 :
+ (instancetype)databaseQueueWithPath:(NSString *)aPath
FMDatabase对象封装在其中,并且创建的同时打开。
关闭:
- (void)close
简单来说,FMDatabaseQueue将FMDatabase进行了封装,推荐使用FMDatabaseQueue
如:
- (void) setupFMDB { NSString * path = [NSString stringWithFormat:@"%@/Documents/h.sqlite", NSHomeDirectory()]; self.queue = [FMDatabaseQueue databaseQueueWithPath:path]; }
FMDatabaseQueue并不是FMDatabase,并没有直接执行SQL语句的方法
使用 inDatabase方法通过block的方式,将执行SQL语句的代码传入
- (void)inDatabase:(void ( ^ ) ( FMDatabase *db ))block
block的参数db即封装在FMDatabaseQueue内部的FMDatabase对象
- FMDatabase执行更新语句
在FMDB中,除查询外的所有操作,都是“更新” ,如:create drop insert delete update
使用executeUpdate:方法执行更新 ,该方法传递一个SQL语句字符串,并可以指定格式参数
- (BOOL)executeUpdate:(NSString *)sql, ... - (BOOL)executeUpdate:(NSString *)sql withArgumentsInArray:(NSArray *)arguments - (BOOL)executeUpdate:(NSString *)sql withErrorAndBindings:(NSError **)outErr, ... - (BOOL)executeUpdate:(NSString *)sql withParameterDictionary:(NSDictionary *)arguments - (BOOL)executeUpdate:(NSString *)sql withVAList:(va_list)args - (BOOL)executeUpdateWithFormat:(NSString *)format, ...
这是一族函数,具有相同的功能,选择一个你习惯的调用方式
如:
- (void) updateDesc:(NSString*) desc forID:(NSString*) ID { [self.queue inDatabase:^(FMDatabase *db) { if ( ![db executeUpdate:@"update t_hero set desc=? where id=?", desc, ID] ) { NSLog(@"%@", [db lastErrorMessage]); } }]; }
- 执行查询语句
执行一个查询语句,使用方法 execteQuery: ,该方法传递一个查询SQL语句,并可以指定占位参数,返回一个查询的结果集对象
- (FMResultSet *)executeQuery:(NSString *)sql, ... - (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments - (FMResultSet *)executeQuery:(NSString *)sql withParameterDictionary:(NSDictionary *)arguments - (FMResultSet *)executeQueryWithFormat:(NSString *)format, ... - (FMResultSet *)executeQuery:(NSString *)sql withVAList:(va_list)args
FMResultSet对象是结果集对象,其内部是链表结构,通过next来遍历每一行结果
既可以通过列的下标过得字段值,也可以通过字段名获得字段值
如:
- (NSString*) getDescWithID:(NSString*) ID { __block NSString *pret = nil; [self.queue inDatabase:^(FMDatabase *db) { FMResultSet * rs = [db executeQuery:@"select desc from t_hero where id=?;", ID]; if ( [rs next] ) { pret = [rs stringForColumn:@"desc"]; } [rs close]; }]; return pret; }
- 事务处理
什么是事务?
也称工作单元,是一个或多个SQL语句组成的序列,作为一个完整的工作单元
如:A到银行为B转账1000元
操作1:A账户 - 1000
操作2:B账户 + 1000
两个操作放在一起构成一个完成的工作单元。
为什么要进行事务处理?
如果操作1成功,但操作2失败了,则会出现***烦
将两个操作放在一个事务中进行处理,保证同时成功或同时失败
事务的sql语句:
开始事务begin transaction
提交事务commit transaction
回滚事务rollback transaction
FMDB的事务处理,如:
[self.queue inTransaction:^(void *db, BOOL * rollback) { FMResultSet * rs = [db executeQuery:@"select * from t_hero;"]; while ( [rs next] ) { //... } if ( ![db executeUpdate:@"insert into t_table(name) values(:)", @"Rose"] ) { *rollback = YES; } }];