第三方库FMDB的作用和用法详解

1、库介绍:

1、FMDB是iOS平台的SQLite数据库框架,以OC/swift的方式封装了SQLite的C语言API

2、使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码,对比苹果自带的Core Data框架,更加轻量级和灵活,提供了多线程安全的数据库操作方法(对多线程的并发操作进行处理),有效地防止数据混乱。FMDB同时兼容ARC和非ARC工程,在编译的时候会自动根据工程配置来调整相关的内存管理代码。

3、github地址:https://github.com/ccgus/fmdb

2、使用方法:

FMDB有三个主要的类:

(1)FMDatabase:一个FMDatabase对象就代表一个单独的SQLite数据库,用来执行SQL语句

(2)FMResultSet:使用FMDatabase执行查询后的结果集

(3)FMDatabaseQueue:如果你想在多线程中执行多个查询或更新,你应该使用该类。这是线程安全的

3、数据库创建:

通过指定SQLite数据库文件路径来创建FMDatabase对象

FMDatabase *db = [FMDatabase databaseWithPath:path];

if (![db open]) {

   NSLog(@"数据库打开失败!");

}

创建FMDatabase对象时参数为SQLite数据库文件路径。该路径可以是以下三种之一:

1、具体文件路径

  • 该文件路径无需真实存,如果不存在会自动创建。

2、空字符串@""

  • 表示会在临时目录创建一个空的数据库,当FMDatabase 链接关闭时,数据库文件也被删除。

3、NULL

  • 会创建一个内存中临时数据库,当FMDatabase连接关闭时,数据库会被销毁

4、打开数据库:

在和数据库交互之前,数据库必须是打开的。如果资源或权限不足无法打开或创建数据库,都会导致打开失败,返回BOOL类型:

if (![db open]) {       

        return;  

  

 }

5、执行更新:

  • 一切不是SELECT命令的命令都视为更新。这包括 CREATE, UPDATE, INSERT,ALTER,COMMIT, BEGIN,DETACH, DELETE, DROP, END, EXPLAIN, VACUUM, and REPLACE (等)。简单来说,只要不是以SELECT开头的命令都是UPDATE命令。
  • 执行更新返回一个BOOL值。YES表示执行成功,否则表示有那些错误 。你可以调用 -lastErrorMessage 和 -lastErrorCode方法来得到更多信息。
  • 使用executeUpdate:方法执行更新
  • - (BOOL)executeUpdate:(NSString*)sql, ...
  • - (BOOL)executeUpdateWithFormat:(NSString*)format, ...
  • - (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments

示例:

[db executeUpdate:@"UPDATE t_student SET age = ? WHERE name = ?;", @20, @"Jack"]

6、执行查询

SELECT命令就是查询,执行查询的方法是以 -excuteQuery开头的。

//查询方法

- (FMResultSet *)executeQuery:(NSString*)sql, ...

- (FMResultSet *)executeQueryWithFormat:(NSString*)format, ...

- (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments

执行查询时,如果成功返回FMResultSet对象, 错误返回nil. 与执行更新相当,支持使用 NSError**参数。同时,你也可以使用 -lastErrorCode和-lastErrorMessage获知错误信息。

为了遍历查询结果,你可以使用while循环。你还需要知道怎么跳到下一个记录。使用FMDB,很简单实现,就像这样:

// 查询数据

FMResultSet *rs = [db executeQuery:@"SELECT * FROM t_student"];

// 遍历结果集

while ([rs next]) {

    NSString *name = [rs stringForColumn:@"name"];

    int age = [rs intForColumn:@"age"];

    double score = [rs doubleForColumn:@"score"];

}

你必须一直调用 -[FMResultSet next] 在你访问查询返回值之前,甚至你只想要一个记录:

FMResultSet *s = [db executeQuery:@"SELECT COUNT(*) FROM myTable"];   

if ([s next]) {    

    int totalCount = [s intForColumnIndex:0];   

}

FMResultSet 提供了很多方法来获得所需的格式的值:

intForColumn:

longForColumn:

longLongIntForColumn:

boolForColumn:

doubleForColumn:

stringForColumn:

dataForColumn:

dataNoCopyForColumn:

UTF8StringForColumnIndex:

objectForColumn:

这些方法也都包括 {type}ForColumnIndex的这样子的方法,参数是查询结果集的列的索引位置。

你无需调用 [FMResultSet close]来关闭结果集, 当新的结果集产生,或者其数据库关闭时,会自动关闭。

7、关闭数据库:

当使用完数据库,你应该 -close 来关闭数据库连接来释放SQLite使用的资源。

[db close];

使用FMDatabaseQueue 及线程安全:

在多个线程中同时使用一个FMDatabase实例是不明智的。现在你可以为每个线程创建一个FMDatabase对象。 不要让多个线程分享同一个实例,它无法在多个线程中同时使用。 若此,坏事会经常发生,程序会时不时崩溃,或者报告异常,或者陨石会从天空中掉下来砸到你Mac Pro. 总之很崩溃。所以,不要初始化FMDatabase对象,然后在多个线程中使用。请使用 FMDatabaseQueue,它是你的朋友而且会帮助你。以下是使用方法:

首先创建队列:

FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:aPath];

[queue inDatabase:^(FMDatabase *db) {    

      [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:1]];    

      [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:2]];    

      [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:3]];    

      FMResultSet *rs = [db executeQuery:@"select * from foo"];    

      while([rs next]) {   

         …    

      }    

}];

像这样,轻松地把简单任务包装到事务里

[queue inTransaction:^(FMDatabase *db, BOOL *rollback) {    

        [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:1]];    

        [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:2]];    

        [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:3]];    

        if (whoopsSomethingWrongHappened) {    

                *rollback = YES; return;    

        }   

        // etc…    

        [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:4]];    

}];

FMDatabaseQueue将运行在一个序列化队列块。所以如果你从多个线程在同一时间调用FMDatabaseQueue的方法,他们将执行他们收到的指令。这样查询和更新不会相互影响,每一个都是快乐的。

8、FMDB使用步骤:

  • 1、下载FMDB文件GitHub,并将FMDB文件夹添加到项目中(也可使用CocoaPods导入)
  • 2、导入libsqlite3.0框架,导入头文件FMDatabase.h
  • 3、代码实现,与SQLite使用步骤相似,创建数据库路径,获得数据库路径,打开数据库,然后对数据库进行增、删、改、查操作,最后关闭数据库。
原文地址:https://www.cnblogs.com/yuhao309/p/6698650.html