【iOS】数据持久化(四)之FMDB

正如我们前面所看到的,原生SQLite API在使用时还是比较麻烦的,于是,开源社区就出现了一系列将SQLite API进行封装的库,其中FMDB的被大多数人所使用

FMDB和SQLite相比较,SQLite比较原始,操作比较复杂,使用的是C的函数对数据库进行操作,但是SQLite可控性更强,并且能够跨平台,FMDB只能在iOS开发中使用

cocoapods导入第三方库FMDB

pod 'FMDB'

参考【iOS】JSONModel的基本使用

目录

    • FMDB简介
    • FMDB基本使用
      • 打开数据库
      • 执行更新操作
      • 执行查询操作
    • 数据参数
    • 数据库队列
    • 总结


FMDB简介

FMDB是iOS开发中的一个轻量级第三方数据库框架,它以OC的方式封装了SQLite的C语言接口,省去了麻烦的C语言代码,且更加面向对象,操作方便

FMDB一般涉及以下3个核心类:

  • FMDatabase:此类的一个实例代表一个SQLite数据库,也有许多执行SQL语句的方法
  • FMResultSet(结果集):使用FMDatabase执行SQLite查询语句后的结果集
  • FMDatabaseQueue(数据库队列):用于在多线程中执行多个查询或更新,它是线程安全的

FMDB基本使用

打开数据库

_dataBase = [FMDatabase databaseWithPath: @"/Users/Username/Desktop/CS/Xcode/FMDBTest/fmDb.sqlite"];
    
if (![_dataBase open]) {
    NSLog(@"打开数据库失败!");
} else {
    NSLog(@"%@", _dataBase.databasePath);
    }

//其他代码
//...
[_dataBase close];
//通常打开操作完成后,需要调用close方法来关闭
  • fmDb.sqlite数据库不存在时,会自动创建

请添加图片描述

  • Path参数传入空字符串@"",会在临时目录创建一个空数据库,FMDatabase连接关闭时,数据库文件也被删除
  • 传入的参数是nil时,会在内存中创建一个临时数据库,FMDatabase连接关闭时,数据库文件会被销毁

执行更新操作

与SQLite一样,除查询以外的所有操作,都称为“更新”,包括createdropinsertupdatedelete

请添加图片描述

传入的参数为SQLite语句字符串

...表示可变数量的参数(变长参数),可以根据需要将一些额外的参数传递给方法

这里以创建表、插入数据作为示例:

BOOL result = [_dataBase executeUpdate: @"CREATE TABLE IF NOT EXISTS t_Student(ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT NOT NULL, AGE INTEGER NOT NULL, SCORE REAL)"];
if (result) {
    NSLog(@"创表成功");
    //插入操作
    for (int i = 0; i < 10; ++i) {
        NSString* name = [NSString stringWithFormat: @"jaxon-%d", arc4random_uniform(100)];
                
    //不确定的参数用?、?占位
    [_dataBase executeUpdate: @"INSERT INTO t_student (name, age) VALUES (?, ?)", name, @(arc4random_uniform(40))];
                
    //不确定的参数用%@、%d占位
    //[_dataBase executeUpdateWithFormat: @"INSERT INTO t_student (name, age) VALUES (@%, %d)", name, @(arc4random_uniform(40))];
    }
            
    //删除操作
    //[_dataBase executeUpdate: @"DROP TABLE IF EXISTS t_student"];
} else {
    NSLog(@"创表失败");
}

执行查询操作

请添加图片描述

只管将SQL查询语句传进去

FMResultSet* resultSet = [_dataBase executeQuery: @"SELECT * FROM t_student"];

//	遍历结果集
while ([resultSet next]) {
    int ID = [resultSet intForColumn: @"ID"];
    NSString* name = [resultSet stringForColumn: @"NAME"];
    int age = [resultSet intForColumn: @"AGE"];
    NSLog(@"%d %@ %d", ID, name, age);
    }

运行结果:

请添加图片描述

可以看到插入操作也是成功的

数据参数

这里还有一些有关参数的小细节:

调用executeUpdate方法来将SQLite语句中?所指代的具体参数传入,通常使用变长参数来传递进去的,像这样:

NSString* sql = @"INSERT INTO t_student (name, age) VALUES (?, ?)";
                [_dataBase executeUpdate: sql, name, @(arc4random_uniform(40))];

变长参数的作用体现在这里

要注意的是,参数必须是NSObject的子类,所以如果有C风格的数据类型,应包装成OC风格才能使用:

//错误
//[_dataBase executeUpdate: @"INSERT INTO t_student VALUES (?)", 42];
//正确
[_dataBase executeUpdate: @"", [NSNumber numberWithInt: 42]];

数据库队列

FMDatabaseQueue涉及到保证线程安全,编者此时此刻并未学习有关线程相关知识,以后再加以了解

总结

FMDB对SQLite进行了良好的封装,使用起来非常方便,对于那些使用纯SQLite来进行数据库操作的项目,可以将其迁移到FMDB上,提高数据库相关功能维护的效率

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/313836.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

css 背景是个图片并且含有透明度的渐变色.超级简单。background相关属性就行了

底纹是个背景图片。 然后上面有个渐变色。渐变色含有透明度这样才能把底纹显示出来 不用麻烦的把图片放进去各种定位修改层级来写啦。 直接一个background相关属性就行了。 背景色怎么增加透明度呢 使用rgba的方式rgba(127,47,255,0.7)。 //0.7是透明度 background-image:li…

全面解读数据安全法规

数据安全&#xff0c;可以说是近些年的热点&#xff0c;特别是随着大数据、人工智能等信息安全技术的快速发展&#xff0c;数据安全和隐私保护形势日益严峻&#xff0c;网络边界被打破&#xff0c;数据安全问题与日俱增。各国也非常重视数据安全建设&#xff0c;如下图展示的全…

Radware负载均衡-全系列产品证书更新(二)

简单介绍一下关于Radware APSolute Vision平台的证书更新。 更新证书有两种方式&#xff0c;一种为自签发&#xff0c;另外一种为导入第三方证书&#xff0c;且更新证书仅能通过命令行的形式更新证书。两种方式都会导致APSolute Vision平台设备的重启&#xff08;老版本&#…

推特Ads投放

一、准备工作&#xff1a; 推特广告账户&#xff1a; 您需要在推特上拥有一个有效的广告账户。 支付方式&#xff1a; 您需要关联一个有效的支付方式&#xff0c;通常是信用卡或其他支持的支付方式。 广告内容符合政策&#xff1a; 您的广告内容必须符合推特的广告政策&#…

高斯数据库 Gauss

gauss DB OLTP 交易 保证数据和安全&#xff0c;主要是银行使用 gauss DB OLAP 分析 大部分是网络公司 gsql 使用gauss数据库的工具 $ gsql -d 数据库名 -p 端口号 -u 用户名 -w 密码 -h 客户端ipgsql 常用参数 -d选项&#xff1a; 指定gsql客户端连接的数据库-h选项&#xff1…

二维点集的凸包点寻找算法

1. 思路 利用凸凹最直接的性质去判断,即:两个相近的凸点组成的直线,将会把他们的近邻点完全隔离在直线的同一侧。如此一来,先选取一个明显的凸点,如y坐标最小的点,以它为出发点,贪婪式搜寻即可。 如下图所示: 假设0点为y坐标最小的点,图中带编号的点为其近邻点(kd-…

生成式AI,发展可持续吗?

最近有消息透露&#xff0c;OpenAI预计在2024年实现16亿美元的年化收入。相较于去年10月预测的13亿美元&#xff0c;这一数字增长了3亿美元&#xff0c;增长部分主要来源于ChatGPT订阅、API接入以及其他业务。 与此同时&#xff0c;其竞争对手Anthropic预计年化收入至少为8.5亿…

MySQL数据被误删怎么办?

文章目录 前言数据备份恢复工具数据备份策略数据备份恢复演示备份数据模拟数据误删恢复备份的数据恢复未备份的数据 总结 前言 很多年前&#xff0c;被公司外派到一家单位驻场开发一个OA项目&#xff0c;两个开发对接各部门的需求&#xff0c;需求还要及时生效&#xff08;一边…

Linux中DCHP与时间同步

目录 一、DHCP &#xff08;一&#xff09;工作原理 1.获取 2.续约 &#xff08;二&#xff09;分配方式 &#xff08;三&#xff09;服务器配置 1.随机地址分配 2.固定地址分配 二、时间同步 &#xff08;一&#xff09;ntpdate &#xff08;二&#xff09;chrony …

程序员必知!解释器模式的实战应用与案例分析

解释器模式是一种灵活处理复杂语言或表达式的设计模式&#xff0c;以智能家居系统为例&#xff0c;用户可用自定义语言编写控制脚本&#xff0c;如“室温高则开空调”&#xff0c;先定义这种语言的简单文法&#xff0c;再构建解释器将脚本转为系统可理解的指令&#xff0c;这样…

固态继电器SSR光耦OR-806A ,对标替代AQW212

固态继电器 VL60V输出端击穿电压光耦 高隔离电压 60 至 600V 输出耐受电压 工业温度范围&#xff1a;-40 to 85℃ 高灵敏度和高速响应 特征 输入和输出之间的高隔离电压 &#xff08;Viso&#xff1a;5000 V rms&#xff09;。 控制低电平模拟信号 高灵敏度和高速响应 …

怎么提高客服满意度?

相应速度 1.即使平时回复手速很快&#xff0c;但一旦接待量一上来脑子转不过来&#xff0c;或是顾客咨询了一些自己不知道的问题&#xff0c;就知道快捷语有多重要。 2.熟悉快捷短语。(针对顾客提出的问题能快速给出反应。) 3. 安装快捷回复软件。(使用[客服宝]快捷回复软件…

使用代理IP池实现多线程爬虫的方法

目录 前言 代理IP的概念和作用 为什么使用代理IP池 代理IP池的实现步骤 代码实现 注意事项 总结 前言 随着互联网的发展&#xff0c;爬虫技术在各个领域中被广泛应用。然而&#xff0c;目标网站对爬虫的限制也日益严格&#xff0c;例如限制单个IP的请求频率。为了解决这…

达摩研究院Paraformer-large模型已支持windows

简介 FunASR是一个基础语音识别工具包&#xff0c;提供多种功能&#xff0c;包括语音识别&#xff08;ASR&#xff09;、语音端点检测&#xff08;VAD&#xff09;、标点恢复、语言模型、说话人验证、说话人分离和多人对话语音识别等。FunASR提供了便捷的脚本和教程&#xff0…

如何使用人工智能优化 DevOps?

DevOps 和人工智能密不可分&#xff0c;影响着各种业务。DevOps 可以加快产品开发速度并简化现有部署的维护&#xff0c;而 AI 则可以改变整个系统的功能。DevOps团队可以依靠人工智能和机器学习来进行数据集成、测试、评估和发布系统。更重要的是&#xff0c;人工智能和机器学…

【软件测试】学习笔记-设计GUI自动化测试策略

这篇文章从“实战”这个角度展开&#xff0c;探讨实际的大型全球化电商网站的GUI自动化测试如何开展。这场实战&#xff0c;从以下两个方面展开&#xff1a; 测试策略如何设计&#xff1f;这一点&#xff0c;我会根据亲身经历的实际项目&#xff0c;和你探讨GUI测试的分层测试…

使用rembg库提取图像前景(移除图像背景),并构建web应用

1、图像中的前景与背景 在深度学习图像处理领域中&#xff0c;图像内容可以被定义为前景与背景两部分&#xff0c;其中感兴趣图形的被定义为前景&#xff0c;不感兴趣区域的背景。如在目标检测中&#xff0c;被框出来的目标则被定义为前景。此外&#xff0c;前景识别也可以理解…

openssl快速生成自签名证书

系统&#xff1a;Centos 7.6 确保已安装openssl openssl version生成私钥文件 private.key &#xff08;文件名自定义&#xff09; openssl genpkey -algorithm RSA -out private.key -pkeyopt rsa_keygen_bits:2048-out private.key&#xff1a;生成的私钥文件-algorithm RS…

从零学Java Set集合

Java Set集合 文章目录 Java Set集合1 Set 集合2 Set实现类2.1 HashSet【重点】2.2 LinkedHashSet2.3 TreeSet 3 Comparator 自定义比较器 1 Set 集合 特点&#xff1a;无序无下标、元素不可重复。 方法&#xff1a;全部继承自Collection中的方法。 常用方法&#xff1a; publ…

❤ Vue3 完整项目太白搭建 Vue3+Pinia+Vant3/ElementPlus+typerscript(一)yarn 版本控制 ltb (太白)

❤ 项目搭建 一、项目信息 Vue3 完整项目搭建 Vue3PiniaVant3/ElementPlustyperscript&#xff08;一&#xff09;yarn 版本控制 项目地址&#xff1a; 二、项目搭建 &#xff08;1&#xff09;创建项目 yarn create vite <ProjectName> --template vueyarn install …
最新文章