码迷,mamicode.com
首页 > 数据库 > 详细

SQLite3的面向对象封装FMDB

时间:2016-03-02 07:10:56      阅读:424      评论:0      收藏:0      [点我收藏+]

标签:ios   app   xcode   数据库   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

标签:ios   app   xcode   数据库   sqlite3   fmdb   

原文地址:http://annmeng.blog.51cto.com/3321237/1746490

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!