1、什么是FMDB?

  • FMDB是iOS平台的SQLite数据库框架
  • FMDB以OC的方式封装了SQLite的C语言API。
  • 无论项目中使用 ARC 还是 MRC,对 FMDB 都没有任何影响,FMDB 会在编译项目时自动匹配。

2、FMDB主要的类。

2.1、FMDatabase
一个FMDatabase对象就代表一个单独的SQLite数据库,用来执行SQL语句。通过指定SQLite数据库文件路径来创建FMDatabase对象。
在FMDB中,一般只要不是以 SELECT 开头的 SQL 语句,都是更新语句,包括CREATE,UPDATE,INSERT,ALTER,COMMIT,BEGIN,DETACH,DROP,END,EXPLAIN,VACUUM,REPLACE等。使用executeUpdate:方法执行更新:
  • - (BOOL)executeUpdate:(NSString*)sql, ...;
  • - (BOOL)executeUpdateWithFormat:(NSString*)format, ...;
  • - (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments;

执行更新语句后会返回一个 BOOL 值,返回YES表示执行更新语句成功,返回NO表示出现错误,可以通过调用 -lastErrorMessage 和 -lastErrorCode 方法获取更多错误信息。

创库创表:

  •   // 获取数据库文件路径
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"test.sqlite"];
    // 创建数据库
    FMDatabase *db = [FMDatabase databaseWithPath:path];
    self.db = db;
    if (db.open) {// 打开数据库,数据库必须是打开状态,才能与之交互。如果没有足够的资源和权限来打开或者创建数据库,数据库会打开失败。
    NSLog(@"打开成功");
    // 创表
    BOOL result = [db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_person (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL)"];
    if (result) {
    NSLog(@"创表成功");
    } else {
    NSLog(@"创表失败:%@", [self.db lastErrorMessage]);
    }
    } else {
    NSLog(@"打开失败");
    }

添加数据:

  •  // executeUpdate:不确定的参数用?来占位,所有参数都必须是对象。
    // BOOL result = [self.db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?)", @"jick", @(arc4random_uniform(20))];
    // executeUpdateWithFormat:不确定的参数用%@、%f、%d、%u等来占位。
    BOOL result = [self.db executeUpdateWithFormat:@"INSERT INTO t_person (name, age) VALUES (%@, %d)", @"jick", arc4random_uniform()];
    if (result) {
    NSLog(@"添加成功");
    } else {
    NSLog(@"添加失败:%@", [self.db lastErrorMessage]);
    }

删除、更新数据:同创表、添加数据方法相同,只需修改SQL语句就行了。

  • 关闭数据库:  [self.db close];

文件路径有三种情况:

  • 具体文件路径:如果不存在会自动创建。
  • 空字符串@"":会在临时目录创建一个空的数据库,当FMDatabase连接关闭时,数据库文件也被销毁。
  • nil:会在内存中创建一个临时数据库,当FMDatabase连接关闭时,数据库会被销毁。

2.2、FMResultSet。

使用FMDatabase执行查询后的结果集:
  • - (FMResultSet *)executeQuery:(NSString*)sql, ...;
  • - (FMResultSet *)executeQueryWithFormat:(NSString*)format, ...;
  • - (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments;
执行查询操作后,如果成功会返回一个FMResultSet对象,反之会返回nil。通过 -lastErrorMessage 和 -lastErrorCode 方法可以确定查询失败原因。
为了遍历查询结果,需要while()循环,然后逐条记录查看。在 FMDB 中,可以通过下面的简单方式实现:
  •  // 执行查询语句
    FMResultSet *result = [self.db executeQuery:@"SELECT * FROM t_person WHERE age < 15"];
    // 遍历结果,它是基于列的位置来查询数据。
    while (result.next) {
    int ID = [result intForColumn:@"id"];
    NSString *name = [result stringForColumn:@"name"];
    int age = [result intForColumn:@"age"];
    NSLog(@"id = %d, name = %@, age = %d", ID, name, age);
    }
  • 关闭数据库:  [self.db close];
2.3、FMDatabaseQueue。
FMDatabase这个类是线程不安全的,如果在多个线程中同时使用一个FMDatabase实例,会造成数据混乱等问题。为了保证线程安全,FMDB提供了FMDatabaseQueue类。
  • FMDatabaseQueue的创建:
  •  数据库文件路径
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"test.sqlite"];
    // 创建数据库
    FMDatabaseQueue *dbq = [FMDatabaseQueue databaseQueueWithPath:path];
    self.dbq = dbq;
    // 打开数据库
    [dbq inDatabase:^(FMDatabase *db) {
    BOOL result = [db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_person (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL)"]; // 创表
    if (result) {
    NSLog(@"创表成功");
    } else {
    NSLog(@"创表失败:%@", [db lastErrorMessage]);
    }
    }];
  • 添加数据:更新、删除和添加数据的方法类似。

     [self.dbq inDatabase:^(FMDatabase *db) {
    BOOL result = [db executeUpdateWithFormat:@"INSERT INTO t_person (name, age) VALUES (%@, %d)", @"jick", arc4random_uniform()];
    if (result) {
    NSLog(@"添加成功");
    } else {
    NSLog(@"添加失败");
    }
    }];
  • 查询数据:

     [self.dbq inDatabase:^(FMDatabase *db) {
    // 执行查询语句
    FMResultSet *result = [db executeQuery:@"SELECT * FROM t_person WHERE age < 15"];
    // 遍历结果
    while (result.next) {
    int ID = [result intForColumn:@"id"];
    NSString *name = [result stringForColumn:@"name"];
    int age = [result intForColumn:@"age"];
    NSLog(@"id = %d, name = %@, age = %d", ID, name, age);
    }
    }];
  • 关闭数据库: [self.dbq close];

3、FMDB的多语句、多事务处理

3.1、多语句的批处理。

通过-executeStatements:withResultBlock:方法在一个字符串中执行多语句:

  • 创建多张表并添加数据:
  •  NSString *sql = [NSString stringWithFormat:
    @"CREATE TABLE IF NOT EXISTS t_person1 (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);"
    "CREATE TABLE IF NOT EXISTS t_person2 (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);"
    "CREATE TABLE IF NOT EXISTS t_person3 (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);"
    "INSERT INTO t_person1 (name, age) VALUES (%@, %d);"
    "INSERT INTO t_person1 (name, age) VALUES (%@, %d);"
    "INSERT INTO t_person2 (name, age) VALUES (%@, %d);"
    "INSERT INTO t_person2 (name, age) VALUES (%@, %d);"
    "INSERT INTO t_person3 (name, age) VALUES (%@, %d);"
    "INSERT INTO t_person3 (name, age) VALUES (%@, %d);",
    @"'jick'", , @"'tom'", , @"'rose'", , @"'jim'", , @"'hank'", , @"'jone'", ];
    BOOL result = [self.db executeStatements:sql];
    if (result) {
    NSLog(@"创表并添加数据成功");
    } else {
    NSLog(@"创表或添加数据失败:%@", [self.db lastErrorMessage]);
    }
  • 查询多张表的多个字段值:
     NSString *sql = @"SELECT * FROM t_person1 WHERE age < 30;"
    "SELECT * FROM t_person2 WHERE age < 30;"
    "SELECT * FROM t_person3 WHERE age < 30;";
    [self.db executeStatements:sql withResultBlock:^int(NSDictionary *resultsDictionary) {
    int ID = [resultsDictionary[@"id"] intValue];
    NSString *name = resultsDictionary[@"name"];
    int age = [resultsDictionary[@"age"] intValue];
    NSLog(@"name = %@, id = %d, age = %d", name, ID, age);
    return ;
    }];

3.2、FMDataba事务处理。

在FMDatabase/FMDatabaseQueue中通过begin/commit语句来开始和提交事务。

  •  //    [self.db executeUpdate:@"begin exclusive transaction"]; // 用SQL语句的方式开启事务
    [self.db beginTransaction]; // 开启事务
    [self.db executeUpdateWithFormat:@"INSERT INTO t_person1 (name, age) VALUES (%@, %d);",@"'jick1'", ];
    [self.db executeUpdateWithFormat:@"INSERT INTO t_person2 (name, age) VALUES (%@, %d);",@"'jick1'", ];
    // [self.db executeUpdate:@"rollback transaction"]; // 用SQL语句的方式中途回滚
    // [self.db rollback]; // 中途回滚。
    [self.db executeUpdateWithFormat:@"INSERT INTO t_person3 (name, age) VALUES (%@, %d);",@"'jick1'", ];
    // [self.db executeUpdate:@"commit transaction"]; // 用SQL语句的方式提交事务
    [self.db commit]; // 提交事务

在FMDatabaseQueue中通过调用方法来提交事务。

  •  [self.dbq inTransaction:^(FMDatabase *db, BOOL *rollback) {
    [db executeUpdateWithFormat:@"INSERT INTO t_person1 (name, age) VALUES (%@, %d);",@"'jick1'", ];
    [db executeUpdateWithFormat:@"INSERT INTO t_person2 (name, age) VALUES (%@, %d);",@"'jick1'", ];
    // *rollback = YES; // 中途回滚
    [db executeUpdateWithFormat:@"INSERT INTO t_person3 (name, age) VALUES (%@, %d);",@"'jick1'", ];
    }];

4、在Swift中使用FMDB。

在Swift项目中使用 FMDB,需要做以下步骤:
  • 将 FMDB 的 .m 和 .h 全部文件拖进你的项目。
  • 如果 Xcode 提示创建桥接文件,需要点击创建。如果没有提示,且项目中也没有桥接文件,需要手动添加。
  • 在桥接文件中,添加这行代码:#import "FMDB.h"
  • 可以从 "src/extra/Swift Extension" 文件夹中拷贝 FMDatabaseVariadic.swift 文件到项目中,就可以使用 executeUpdate 和 executeQuery 多参数了。
做完上述几步,就可以使用 FMDatabase 写 Swift 代码了。

FMDB的简单使用的更多相关文章

  1. iOS 数据库第三方FMDB的简单使用

    一 FMDB的简单说明及介绍 FMDB的github地址 https://github.com/ccgus/fmdb FMDB是一款简洁的,易用的封装库,简单介绍一下FMDB的使用 在FMDB下载文件 ...

  2. FMDB的简单实用

    一.FMDB 的框架引入点击此处去GitHub下载 二.FMDB 的优缺点 优点:使用起来更加面向对象,省去了很多麻烦.冗余的C语言代码:对比苹果自带的Core Data框架,更加轻量级和灵活:提供了 ...

  3. 第三方FMDB的简单使用

    1,导入第三方头文件 #import "FMDB.h" //定义全局变量 @implementation InputInformationViewController { UITe ...

  4. FMDB的简单用法

    使用cocoaPods将FMDB下载到工程 第一步:引入框架,引入支持类库(libsqlite3.0.tbd) #import <FMDB.h> 声明属性 @interface ViewC ...

  5. iOS开发——高级篇——FMDB 数据库简单使用

    #import <Foundation/Foundation.h> @interface UserDB : NSObject // 把userDB设计成一个单例类 + (id)shareI ...

  6. FMDB最简单的教程-3 清空数据表并将自增字段清零

    [db executeUpdate:@"DELETE FROM MemberInfo"]; [db executeUpdate:@"UPDATE sqlite_seque ...

  7. 【原】FMDB源码阅读(二)

    [原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...

  8. iOS Sqlite3 Demo 及 FMDB Demo

    本文是主要实现了三个函数: testSQLite3 是测试系统自带的sqlite3的demo testFMDB是测试FMDB存取简单的数据类型的 的demo testFMDB2是将任意对象作为一个整体 ...

  9. 数据存储之第三方FMDB

    上周四.周五在忙公司的事情和炒股,没来得及更新博客,这周就补一下,学习总结下FMDB. FMDB是对sqlite的封装,特别是在多线程情况下,使用sqlite是非常麻烦,而使用FMDB相对简单,下面是 ...

随机推荐

  1. 利用Travis CI 让你的github项目持续构建

    Travis CI 是目前新兴的开源持续集成构建项目,它与jenkins,GO的很明显的特别在于采用yaml格式,简洁清新独树一帜.目前大多数的github项目都已经移入到Travis CI的构建队列 ...

  2. 对于 ThreadLocal 的理解和应用

    首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的.各 ...

  3. 基于MVC4+EasyUI的Web开发框架经验总结(3)- 使用Json实体类构建菜单数据

    最近花了不少时间在重构和进一步提炼我的Web开发框架上,力求在用户体验和界面设计方面,和Winform开发框架保持一致,而在Web上,我主要采用EasyUI的前端界面处理技术,走MVC的技术路线,在重 ...

  4. Android学习笔记(九) 视图的应用布局效果

    最近少了写博客,可能最近忙吧,工作上忙,因为工作原因也忙于学习,也没记录什么了,也没有按照之前的计划去学习了.现在就记录一下最近学到的. 要做Android应用,界面设计少不了,可惜之前一直在用Win ...

  5. 如何获取配置文件Web.config的AppSetting节点数据

    ConfigurationManager必须要先在工程里添加system.configuration.dll程序集的引用. 1 System.Configuration.ConfigurationMa ...

  6. TextBox禁止复制粘贴和数字验证,小数验证,汉字验证

    验证小数 #region 验证小数 /// <summary> /// 验证小数 /// </summary> /// <param name="sender& ...

  7. LinuxMint 17.1 Cinnamon桌面窗口焦点bug

    LinuxMint 升级到 17.1后,发现桌面彻底不爽了. 发现各应用窗口经常无法正常获取焦点,必须用Alt + Tab切换才能解锁. 乌龙...

  8. 2016暑假多校联合---Rikka with Sequence (线段树)

    2016暑假多校联合---Rikka with Sequence (线段树) Problem Description As we know, Rikka is poor at math. Yuta i ...

  9. Java基础复习笔记系列 七 IO操作

    Java基础复习笔记系列之 IO操作 我们说的出入,都是站在程序的角度来说的.FileInputStream是读入数据.?????? 1.流是什么东西? 这章的理解的关键是:形象思维.一个管道插入了一 ...

  10. Verilog学习笔记设计和验证篇(五)...............层次化事件队列

    详细的了解层次化事件队列有助于理解Verilog的阻塞赋值和非阻塞赋值功能.所谓层次化事件队列指的是用于调度仿真时间的不同Verilog事件队列.在IEEE的5.3节中定义了层次化事件队列在逻辑上分为 ...