SQLite3的面向对象封装FMDB

前端之家收集整理的这篇文章主要介绍了SQLite3的面向对象封装FMDB前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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:方法执行更新

,该方法传递一个sql语句字符串,并可以指定格式参数

-(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;
}
}];

猜你在找的Sqlite相关文章