FMDB简介
什么是FMDB?
FMDB是iOS平台的sqlite数据库框架
FMDB以OC是以OC的方式封装了sqlite的C语言API
FMDB的优点?
使用起来更加面向对象,省去了很多麻烦、冗余代码
对比苹果自带的CoreData框架,更加轻量级和灵活
提供了多线程安全的数据库操作方法,有效地方志数据混乱。
FMDB的github托管地址:https://github.com/ccgus/fmdb
FMDatabase对象
FMDatabase对象:代表一个独立的sqlite数据库
数据库的打开/创建:
FMDatabase *db = [FMDatabase databaseWithPath:path];
if(![dbopen]){
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 {
NSSting *path = [NSString stringWithFormat:@"%@/Docunments/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:方法执行更新
-(BOOL)executeUpdate:(NSString*)sql,…
-(BOOL)executeUpdate:(NSString*)sqlwithArgumentsInArray:(NSArray*)arguments
-(BOOL)executeUpdate:(NSString*)sqlwithErrorAndBindings:(NSError**)outErr,…
-(BOOL)executeUpdate:(NSString*)sqlwithParameterDictionary:(NSDictionary*)arguments
-(BOOL)executeUpate:(NSString*)sqlwithVAList:(va_list)args,…
-(BOOL)executeUpdateWithFormat:(NSString*)format,…
这是一组函数,具有相同的功能,选择一个你习惯的调用方式
如:
-(void)updateDesc:(NSString*)desc forID:(NSString*)ID{ @H_502_117@[self.queueinDatabase:^(FMDatabase *db){ if(![db excuteUpdate:@"update_heroset desc = ? wherein = ? ",desc,ID]){ NSLog(@"%@",[dblastErrorMessage]); @H_502_117@}
}];
}
executeQuery:执行查询语句
,该方法传递一个查询sql语句,并可以指定站位参数,返回一个查询的结果集对象
-(FMResultSet*)executeQuery:(NSString*)sql,…
-(FMResultSet*)executeQuery:(NSString*)sqlwithArgumentsInArray:(NSArray*)arguments
-(FMResultSet*)executeQuery:(NSString*)sqlwithParameterDictionary:(NSDictionary*)arguments
-(FMResultSet*)executeQueryWithFormat:(NSString*)format,…
-(FMResultSet*)executeQuery:(NSString*)sqlwithVAList:(va_list)args
FMResultSet对象是结果集对象,其内部是链表结构,通过next来便利每一行结果
既可以通过列的下标得字段值,也可以通过字段名获得字段值
如:
-(NSString*)getDescWithID:(NSString*)ID{
__blocK NSString *pret = nil;
[self.queue inDatabase:^(FMDatabase *db){
FMResultSet *rs = [db executeQuery:@"selected desc from t_hero wherein = ?;",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 excuteUpdate:@"insert into t_table(name)values(:)",@"Rose"]){
*rollback = YES;
}
}];