小工具      在线工具  汉语词典  css  js  c++  java

1.什么是FMDB?

iOS中使用C语言函数对原生SQLite数据库进行增删改查操作,复杂麻烦,于是,就出现了一系列将SQLite API封装的库,如FMDB
FMDB是针对libsqlite3框架进行封装的三方,它以OC的方式封装了SQLite的C语言的API,使用步骤与SQLite相似
FMDB的优点是:
(1) 使用时面向对象,避免了复杂的C语言代码
(2) 对比苹果自带的Core Data框架,更加轻量级和灵活
(3) 提供多线程安全处理数据库操作方法,保证多线程安全跟数据准确性
FMDB缺点:
(1) 因为是OC语言开发,只能在iOS平台上使用,所以实现跨平台操作时存在限制性
FMDB 在Git上的下载链接地址: https://github.com/ccgus/fmdb
二. 主要类型
FMDatabase:一个FMDatabase对象代表一个单独的SQLite数据库,通过SQLite语句执行数据库的增删改查操作
FMResultSet:使用FMDatabase对象查询数据库后的结果集
FMDatabaseQueue:用于多线程数据库操作,保证线程安全-----官方推荐使用这个,线程安全


三:部分demo数据
/*
*  FMDatabaseQueue使用案例
*/
- (void)FMDatabaseQueueTest{
    //1、获取数据库文件路径
    NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *fileName = [doc stringByAppendingPathComponent:@"students.sqlite"];
    
    //使用
    FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:fileName];
    [queue inDatabase:^(FMDatabase *db) {  
        [db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student_2 (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);"];
        [db executeUpdate:@"INSERT INTO t_student_2 (name, age) VALUES ('yixiangZZ', 20);"];
        [db executeUpdate:@"INSERT INTO t_student_2 (name, age) VALUES ('yixiangXX', 25);"];
        
        FMResultSet *rs = [db executeQuery:@"SELECT * FROM t_student_2"];
        
        NSLog(@"%@",[NSThread currentThread]);
        while ([rs next]) {
            int ID = [rs intForColumn:@"id"];
            NSString *name = [rs stringForColumn:@"name"];
            int age = [rs intForColumn:@"age"];
            NSLog(@"%d %@ %d",ID,name,age);
        }
        
    }];
    
    //支持事务
    [queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
        [db executeUpdate:@"UPDATE t_student_2 SET age = 40 WHERE name = 'yixiangZZ'"];
        [db executeUpdate:@"UPDATE t_student_2 SET age = 45 WHERE name = 'yixiangXX'"];
        
        BOOL hasProblem = NO;
        if (hasProblem) {
            *rollback = YES;//回滚
            return;
        }
        
        FMResultSet *rs = [db executeQuery:@"SELECT * FROM t_student_2"];
        NSLog(@"%@",[NSThread currentThread]);
        while ([rs next]) {
            int ID = [rs intForColumn:@"id"];
            NSString *name = [rs stringForColumn:@"name"];
            int age = [rs intForColumn:@"age"];
            NSLog(@"%d %@ %d",ID,name,age);
        }
        
    }];
}

/**
 *  FMDatabaseQueue如何实现多线程的案例
 */
- (void)FMDatabaseQueueMutilThreadTest{
    //1、获取数据库文件路径
    NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *fileName = [doc stringByAppendingPathComponent:@"students.sqlite"];
    
    //使用queue1
    FMDatabaseQueue *queue1 = [FMDatabaseQueue databaseQueueWithPath:fileName];
    
    [queue1 inDatabase:^(FMDatabase *db) {
        for (int i=0; i<10; i++) {
            NSLog(@"queue1---%zi--%@",i,[NSThread currentThread]);
        }
    }];
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [queue1 inDatabase:^(FMDatabase *db) {
            for (int i=11; i<20; i++) {
                NSLog(@"queue1---%zi--%@",i,[NSThread currentThread]);
            }
        }];
    });
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [queue1 inDatabase:^(FMDatabase *db) {
            for (int i=20; i<30; i++) {
                NSLog(@"queue1---%zi--%@",i,[NSThread currentThread]);
            }
        }];
    });
    
    //虽然开启了多个线程,可依然还是串行处理。原因如下:
    
    /**FMDatabaseQueue虽然看似一个队列,实际上它本身并不是,它通过内部创建一个Serial的dispatch_queue_t来处理通过inDatabase和inTransaction传入的Blocks,所以当我们在主线程(或者后台)调用inDatabase或者inTransaction时,代码实际上是同步的。FMDatabaseQueue这么设计的目的是让我们避免发生并发访问数据库的问题,因为对数据库的访问可能是随机的(在任何时候)、不同线程间(不同的网络回调等)的请求。内置一个Serial队列后,FMDatabaseQueue就变成线程安全了,所有的数据库访问都是同步执行,而且这比使用@synchronized或NSLock要高效得多。
     */
}

. . .

相关推荐

额外说明

MyBatis 拦截器原理和使用方法

文章目录 1. 基础介绍 1.1. 核心对象 1.2. 执行过程 2. 实现步骤 2.1. 添加注解 2.1.1. type 2.1.2. method 2.1.3. args 2.2. 方法实现 2.2.1. intercept 2.2.2. plug

额外说明

Windows故障转移集群

Windows2012作为根域 两台Windows2008加入域 创建三台Windows 分别是Windows2012和两台Windows2008  并选择其环境   创建三个十g的卷,连接至Windows2012   清理三台主机的后台数据 然后修改三

额外说明

CCNA 基础知识

CCNA 基础知识 概述 网络四要素 网络拓扑 总线拓扑 星型拓扑 环形拓扑 树形拓扑 网状拓扑 协议与标准化 标准化组织 OSI 模型 物理层 数据链路层 网络层 传输层 会话层 表示层 应用层 总结 TCP/IP 模型 网络基础 通信模式 单工 半双

额外说明

解密长短时记忆网络(LSTM):从理论到PyTorch实战演示

目录 1. LSTM的背景 人工神经网络的进化 循环神经网络(RNN)的局限性 LSTM的提出背景 2. LSTM的基础理论 2.1 LSTM的数学原理 遗忘门(Forget Gate) 输入门(Input Gate) 记忆单元(Cell State)

额外说明

【Linux网络编程】select多路复用

文章目录 前言 如何增强服务端的通信能力 Linux的设计哲学 文件描述符 代码讲解 以文件方式操作命令行 阻塞函数与非阻塞函数 轮询 select() 代码全貌 The End 前言 我们上节课讲解了服务端的编程(Linux服务端编程初体验) 本节课要

额外说明

异常处理(七)--------initializr-service.jar中没有主清单属性

异常详情 initializr-service.jar中没有主清单属性 问题背景 今天自己做了个SpringBoot项目生成服务器,把jar包传到线上,命令运行后查看log发现这个问题。 命令: nohup java -Xms128m -Xmx256m

额外说明

【PAT乙级】1008 数组元素循环右移问题

目录 一、题目 二、我的AC代码 一、题目 1008 数组元素循环右移问题 (20分)   一个数组 A A A 中存有 N N N ( > 0 ) (\gt 0) (>0) 个整数,在不允许使用另外数组的前提下,将每个整数循环向右移 M M M ( ≥

额外说明

Java微服务篇5——Docker

Java微服务篇5——Docker 1、虚拟化技术 虚拟化技术是一种计算机资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储 等,予以抽象、转换后呈现出来。虚拟化技术打破了计算机实体结构间的,不可切割的障碍。使用户可 以比原本的组态更好的

额外说明

Windows系统出现缺少msdmo.dll文件导致异常的解决办法

其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个msdmo.dll文件(挑选

ads via 小工具