SQLite3的面向对象封装FMDB

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQLite3的面向对象封装FMDB相关的知识,希望对你有一定的参考价值。

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




     


本文出自 “teacherAn” 博客,请务必保留此出处http://annmeng.blog.51cto.com/3321237/1746490

以上是关于SQLite3的面向对象封装FMDB的主要内容,如果未能解决你的问题,请参考以下文章

FMDB浅析

第三方库FMDB的使用

数据存储_FMDB

IOS-FMDB

(SQLite3封装) 一行代码实现增删改查 - 值得收藏转发分享

iOS 开发之 FMDB 源码分析