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

2024-01-13 08:04
文章标签 数据 ios 持久 fmdb

本文主要是介绍【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上,提高数据库相关功能维护的效率

这篇关于【iOS】数据持久化(四)之FMDB的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/600756

相关文章

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

Pandas统计每行数据中的空值的方法示例

《Pandas统计每行数据中的空值的方法示例》处理缺失数据(NaN值)是一个非常常见的问题,本文主要介绍了Pandas统计每行数据中的空值的方法示例,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是空值?为什么要统计空值?准备工作创建示例数据统计每行空值数量进一步分析www.chinasem.cn处

如何使用 Python 读取 Excel 数据

《如何使用Python读取Excel数据》:本文主要介绍使用Python读取Excel数据的详细教程,通过pandas和openpyxl,你可以轻松读取Excel文件,并进行各种数据处理操... 目录使用 python 读取 Excel 数据的详细教程1. 安装必要的依赖2. 读取 Excel 文件3. 读

Spring 请求之传递 JSON 数据的操作方法

《Spring请求之传递JSON数据的操作方法》JSON就是一种数据格式,有自己的格式和语法,使用文本表示一个对象或数组的信息,因此JSON本质是字符串,主要负责在不同的语言中数据传递和交换,这... 目录jsON 概念JSON 语法JSON 的语法JSON 的两种结构JSON 字符串和 Java 对象互转

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

SpringBoot使用GZIP压缩反回数据问题

《SpringBoot使用GZIP压缩反回数据问题》:本文主要介绍SpringBoot使用GZIP压缩反回数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot使用GZIP压缩反回数据1、初识gzip2、gzip是什么,可以干什么?3、Spr

SpringBoot集成Milvus实现数据增删改查功能

《SpringBoot集成Milvus实现数据增删改查功能》milvus支持的语言比较多,支持python,Java,Go,node等开发语言,本文主要介绍如何使用Java语言,采用springboo... 目录1、Milvus基本概念2、添加maven依赖3、配置yml文件4、创建MilvusClient

SpringValidation数据校验之约束注解与分组校验方式

《SpringValidation数据校验之约束注解与分组校验方式》本文将深入探讨SpringValidation的核心功能,帮助开发者掌握约束注解的使用技巧和分组校验的高级应用,从而构建更加健壮和可... 目录引言一、Spring Validation基础架构1.1 jsR-380标准与Spring整合1