【iOS】数据持久化(四)之FMDB基本使用

news/2024/2/23 15:06:44/文章来源:https://blog.csdn.net/XY_Mckevince/article/details/135551811

正如我们前面所看到的,原生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.luyixian.cn/news_show_925256.aspx

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

相关文章

GPT/GPT4在人工智能,深度学习,编程等领域应用

详情点击链接&#xff1a;GPT/GPT4在人工智能&#xff0c;深度学习&#xff0c;编程等领域应用 一OpenAI 1.最新大模型GPT-4 Turbo 2.最新发布的高级数据分析&#xff0c;AI画图&#xff0c;图像识别&#xff0c;文档API 3.GPT Store 4.从0到1创建自己的GPT应用 5. 模型Ge…

价值7500的在线授权网站源码支持IP+域名+双向授权全开源

PHP授权验证更新系统完整版&#xff0c;一键更新系统&#xff0c;一键卡密生成自助授权功能&#xff0c;域名ip双重验证功能等等 修复盗版检测&#xff0c;确保实时查看盗版 修复在线加密系统&#xff0c;一键加密 授权系统几乎所有的程序都能整合使用,包括您的app和计算机程序…

数据结构实战:变位词侦测

文章目录 一、实战概述二、实战步骤&#xff08;一&#xff09;逐个比较法1、编写源程序2、代码解释说明&#xff08;1&#xff09;函数逻辑解释&#xff08;2&#xff09;主程序部分 3、运行程序&#xff0c;查看结果4、计算时间复杂度 &#xff08;二&#xff09;排序比较法1…

docker 安装 zookeeper ( 亲测有效 )

目录 1 安装2 验证 1 安装 上传 zookeeoer.tar 包 到服务器 上传之后tar 包&#xff0c;将他变成镜像 输入docker images,发现目前是没有镜像的&#xff0c;现在将tar 包变成镜像 docker load -i zookeeper.tar因为我们要使用 Docker-compose 去管理容器&#xff0c;所以要使…

网络共享服务

存储类型&#xff1a;直连式&#xff08;DAS&#xff09;:距离最近&#xff0c;存储设备且直接连接到服务器上 存储区域网络&#xff08;SAN&#xff09;&#xff1a;适用于大型应用或数据库系统&#xff0c;可以使用文件的空间&#xff0c; 以及管理空间…

深入理解 Flink(五)Flink Standalone 集群启动源码剖析

前言 Flink 集群的逻辑概念&#xff1a; JobManager(StandaloneSessionClusterEntrypoint) TaskManager(TaskManagerRunner) Flink 集群的物理概念&#xff1a; ResourceManager(管理集群所有资源&#xff0c;管理集群所有从节点) TaskExecutor(管理从节点资源&#xff0c;接…

使用WAF防御网络上的隐蔽威胁之SSRF攻击

服务器端请求伪造&#xff08;SSRF&#xff09;攻击是一种常见的网络安全威胁&#xff0c;它允许攻击者诱使服务器执行恶意请求。与跨站请求伪造&#xff08;CSRF&#xff09;相比&#xff0c;SSRF攻击针对的是服务器而不是用户。了解SSRF攻击的工作原理、如何防御它&#xff0…

贪心算法(思路)

最近在cf上做了很多贪心的题&#xff0c;写篇博客来总结一下 Problem - C - Codeforces 看第一道题 不难看出&#xff0c;我们需要在数组中找到一段奇偶相间的序列&#xff0c;要使他们的和最大&#xff0c; 在图中我们假设[1,2]和[3,4]是奇偶相间的序列&#xff0c;我们在在…

【Docker】数据卷挂载以及宿主机目录挂载的使用

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Docker实战》。&#x1f3af;&#x1f3af; &…

docker部署私人云盘nextcloud

首先查看效果 1.拉取镜像 docker pull nextcloud 2.创建目录 mkdir -p /data/nextcloud/{config,data,apps} 3.创建实例 docker run -itd --name yznextcloud -v /data/nextcloud/config:/var/www/html/config -v /data/nextcloud/data:/var/www/html/data -v /data/nextc…

关于html导出word总结一

总结 测试结果不理想&#xff0c;html-to-docx 和 html-docx-js 最终导出的结果 都 差强人意&#xff0c;效果可以见末尾的附图 环境 "electron": "24.3.0" 依赖库 html-docx-js html-docx-js - npm html-to-docx html-to-docx - npm file-saver…

基于DNA的密码学和隐写术综述

摘要 本文全面调研了不同的脱氧核糖核酸(DNA)-基于密码学和隐写术技术。基于DNA的密码学是一个新兴领域,利用DNA分子的大规模并行性和巨大的存储容量来编码和解码信息。近年来,由于其相对传统密码学方法的潜在优势,如高存储容量、低错误率和对环境因素的抗性,该领域引起…

JDK8-JDK17版本升级

局部变量类型推断 switch表达式 文本块 Records 记录Records是添加到 Java 14 的一项新功能。它允许你创建用于存储数据的类。它类似于 POJO 类&#xff0c;但代码少得多&#xff1b;大多数开发人员使用 Lombok 生成 POJO 类&#xff0c;但是有了记录&#xff0c;你就不需要使…

第 2 章 数据结构和算法概述

文章目录 2.1 数据结构和算法的关系2.2 看几个实际编程中遇到的问题2.2.1 问题一-字符串替换问题2.2.2 一个五子棋程序2.2.3 约瑟夫(Josephu)问题(丢手帕问题)2.2.4 其它常见算法问题: 2.3 线性结构和非线性结构2.3.1 线性结构2.3.2 非线性结构 2.1 数据结构和算法的关系 数据 …

使用Qt连接scrcpy-server控制手机

Qt连接scrcpy-server 测试环境如何启动scrcpy-server1. 连接设备2. 推送scrcpy-server到手机上3. 建立Adb隧道连接4. 启动服务5. 关闭服务 使用QTcpServer与scrcpy-server建立连接建立连接并视频推流完整流程1. 开启视频推流过程2. 关闭视频推流过程 视频流的解码1. 数据包协议…

【STM32】HAL库的STOP低功耗模式UART串口唤醒,第一个接收字节出错的问题(已解决)

【STM32】HAL库的STOP低功耗模式UART串口唤醒&#xff0c;第一个接收字节出错的问题&#xff08;已解决&#xff09; 文章目录 BUG复现调试代码推测原因及改进方案尝试中断时钟供电外设唤醒方式校验码硬件问题 切换到STOP0模式尝试结论和猜想解决方案附录&#xff1a;Cortex-M…

js动态设置关键侦@keyframes

js动态设置关键侦keyframes 1.前置知识 关键侦keyframes规则通过在动画序列中定义关键侦的样式来控制CSS动画序列的中间步骤 keyframes slidein {from {transform: translateX(0%);}to {transform: translateX(100%);} } // from 等价于 0%&#xff1b;to 等价与 100% // 或…

【已解决】C语言进行多线程数据切割查找数据

第一次听到多线程切割&#xff0c;笔者也没听的太懂&#xff0c;但发现多线程数据切割其实就是分出多个线程&#xff0c;进行处理查找数据的事情。而为什么切割呢&#xff0c;就是因为数据不够线程数分的&#xff0c;假如1k个数据&#xff0c;7个线程&#xff0c;这里不能够整除…

RabbitMQ的安装使用

RabbitMQ是什么&#xff1f; MQ全称为Message Queue&#xff0c;消息队列&#xff0c;在程序之间发送消息来通信&#xff0c;而不是通过彼此调用通信。 RabbitMQ 主要是为了实现系统之间的双向解耦而实现的。当生产者大量产生数据时&#xff0c;消费者无法快速消费&#xff0c;…

蓝桥杯备赛 | 洛谷做题打卡day5

蓝桥杯备赛 | 洛谷做题打卡day5 图论起航&#xff0c;一起来看看深&#xff08;广&#xff09;度优先吧 ~ 文章目录 蓝桥杯备赛 | 洛谷做题打卡day5图论起航&#xff0c;一起来看看深&#xff08;广&#xff09;度优先吧 ~【深基18.例3】查找文献题目描述 输入格式输出格式样例…