您的位置:首页 > 数据库

SQLite3的面向对象封装FMDB

2016-03-01 22:22 423 查看
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;
}
}];
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iOS App Xcode