zoukankan      html  css  js  c++  java
  • 第三方库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使用步骤相似,创建数据库路径,获得数据库路径,打开数据库,然后对数据库进行增、删、改、查操作,最后关闭数据库。
  • 相关阅读:
    分享分享JavaScript100例-仅供参考
    为每个页面加上Session判断
    Javascript实现真实字符串剩余字数提示
    格式与文件扩展名指定的格式不一致
    谈谈Github Universe 2019
    合并两个有序链表的golang实现
    二叉搜索树的最近公共祖先的golang实现
    验证二叉搜索树的golang实现
    三数之和的golang实现
    有效的字母异位词的golang实现
  • 原文地址:https://www.cnblogs.com/yuhao309/p/6698650.html
Copyright © 2011-2022 走看看