OC包装下的轻量SQL——FMDB

什么是FMDB

官方介绍:

This is an Objective-C wrapper around SQLite.

FMDB是针对libsqlite3框架进行封装的三方数据库,它以OC的方式封装了SQLite的C语言的API,使用步骤与SQLite相似。
FMDB的GitHub链接
 

FMDB的优缺点

FMDB的基本类

  1. FMDatabaseQueue : 用于在多线程中执行多个查询或更新的操作,它是线程安全的
  2. FMDatabase : 代表一个单独的SQLite数据库,用于执行SQL语句
  3. FMResultSet : 代表使用FMDatabase执行查询语句获得的结果
    请添加图片描述

FMDB的使用方法

1.导入FMDB

  1. 使用Cocopads pod 'FMDB' 引入FMDB,或在git上下载添加到项目中。
  2. 在项目中添加头文件:#import "FMDB.h"
     

2.创建FMDB数据库

(1)获取数据库文件的路径

NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
NSString *sqlFilePath = [path stringByAppendingPathComponent:@"story.sqlite"];

 

  • 关于NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory, NSSearchPathDomainMask domainMask, BOOL expandTilde):

函数原型:NSArray<NSString *> *NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory, NSSearchPathDomainMask domainMask, BOOL expandTilde);

iPhone会为每一个应用程序生成一个私有目录,并随即生成一个数字字母串作为目录名。在每一次应用程序启动时,这个字母数字串都是不同于上一次。
iOS中沙盒模型中有四个文件夹,我们通常使用其中的Documents目录进行数据持久化的保存,而这个Documents目录可以通过:NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserdomainMask,YES)
得到。

根据一个数据库文件路径来创建一个FMDatabase对象,路径三种形式:

  1. 一个文件的系统路径:如果不存在该路径,会自动创建
  2. 一个空字符串@"":在一个临时目录下创建一个空的数据库,当数据库连接关闭,自动删除数据库文件
  3. NULL:会创建一个内存中临时数据库,当数据库连接关闭的时候,将被自动删除

后两种不是我们的需要,因为我们需要在关闭连接之后,数据库文件依旧存在。

(2)获取数据库

FMDatabase *db = [FMDatabase databaseWithPath:sqlFilePath];
self.DataBase = db;

(3)打开数据库

if (![self.Database open]) {
    self.Database = nil;
    return;
}

if ([self.Database open]) {

}

如果打开失败,则将db对象置位nil,直接return。因为既然都打不开,肯定不能进一步进行增删改查的操作。

(4)创表

BOOL result = [self.Database executeUpdate:@"CREATE TABLE 'collect_story' ('title' VARCHAR(255), 'image' BLOB)"];
if (result) {
    NSLog(@"创表成功");
} else {
    NSLog(@"创表失败");
}

(5)完整创建数据库

//(1)获取数据库文件的路径
NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
NSString *sqlFilePath = [path stringByAppendingPathComponent:@"story.sqlite"];
//(2)获取数据库
FMDatabase *db = [FMDatabase databaseWithPath:sqlFilePath];
self.DataBase = db;
self
//(3)打开数据库
if (![self.Database open]) {
    self.Database = nil;
    return;
}
if ([self.Database open]) {
	//(4)创表
	BOOL result = [self.Database executeUpdate:@"CREATE TABLE 'collect_story' ('title' VARCHAR(255), 'image' BLOB)"];
	if (result) {
	    NSLog(@"创表成功");
	} else {
	    NSLog(@"创表失败");
	}
}

 

3.FMDB数据库的增删改查

增加数据

- (void)insertTitle:(NSString *)titleStr andImage:(NSDate *)imageDate {
    if ([self.Database open]) {
        NSLog(@"打开成功");
        NSString *sql = @"INSERT INTO collect_story (title,image) VALUES (?,?)";
        BOOL result = [self.Database executeUpdate:sql, titleStr, imageDate];
        if (result) {
            NSLog(@"增加数据成功");
        } else {
            NSLog(@"增加数据失败");
        }
        [self.Database close];
    } else {
        NSLog(@"打开失败");
    }
}

第四行INSERT INTO XXX :向XXX数据库中插入数据。后边的第一个括号是你要赋值的索引,VALUES之后就是你要赋的值。注意索引和索引数的对应,还有要和当时定义类型的匹配。

删除数据

- (void)deleteData {
    if ([self.Database open]) {
        NSString *sql = @"delete from collect_story WHERE collectionState = ?";
        BOOL result = [self.Database executeUpdate:sql, @"xixixixi"];
        if (!result) {
            NSLog(@"数据删除失败");
        } else {
            NSLog(@"数据删除成功");
        }
        [self.Database close];
    }
}

第三行delete from XXX WHERE a = ?:意思是删除XXX数据库中的一组数据,当WHERE之后的a = ?条件成立后。

更新数据

- (void)updateData {
    if ([self.Database open]) {
        NSString *sql = @"UPDATE collect_story SET id = ? WHERE nameLabel = ?";
        BOOL result = [self.Database executeUpdate:sql, @"111", @"复杂化"];
        if (!result) {
            NSLog(@"数据修改失败");
        } else {
            NSLog(@"数据修改成功");
        }
        [self.Database close];
    }
}

第三行UPDATE XXX SET id = ? WHERE a = ?:意思是更新XXX中的id索引对应的数据,当WHERE后的 a = ? 条件成立的时候。

查找数据

- (void)queryData {
    if ([self.Database open]) {
        // 1.执行查询语句
        FMResultSet *resultSet = [self.Database executeQuery:@"SELECT * FROM collect_story"];
        // 2.遍历结果
        while ([resultSet next]) {
            NSString *nameLabel = [resultSet stringForColumn:@"nameLabel"];
            NSLog(@"nameLabel = %@",nameLabel);
            NSString *imageURL = [resultSet stringForColumn:@"imageURL"];
            NSLog(@"imageURL = %@",imageURL);
        }
        [self.Database close];
    }
}

第三行SELECT * FROM XXX:选择XXX中的数据。

上述代码都是基本的增删改查语句,还有更高级的SQL语句,能提供更丰富的操作。SQL常用增删改查语句
 

FMDB相关

1.FMDB使用须知

  1. 多线程不能共享一个FMDatabase对象,也不能在多线程下同时创建多个FMDatabaseQueue实例来操作同一个数据库,这样可能会造成数据的操作丢失。
  2. FMDB是sqlite的封装,而文件数据sqlite在同一时刻允许多个线程、进程读,但是同一时刻不允许多个线程写。
  3. FMDatabaseQueue解决多线程问题的思路:创建一个队列,然后将需要执行的数据库操作放到block中。队列中的block按照添加进队列的顺序依次执行,实际上还是同步的操作,避免了多个线程对数据库的访问。

2.数据库存储的数据类型

  1. integer:整形值
  2. real:浮点值
  3. text:文本字符串
  4. blob:二进制数据(比如文件)
     

未完待续

  1. 不同数据库是否使用“事物”方式插入数据效率不同
    在这里插入图片描述

数据库事务的概念及其实现原理

  1. 关于FMDatabaseQueue的线程安全FMDatabaseQueue 如何保证线程安全
安装Docker安装插件,可以按照以下步骤进行操作: 1. 首先,安装Docker。可以按照官方文档提供的步骤进行安装,或者使用适合您操作系统的包管理器进行安装。 2. 安装Docker Compose插件。可以使用以下方法安装: 2.1 下载指定版本的docker-compose文件: curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose 2.2 赋予docker-compose文件执行权限: chmod +x /usr/local/bin/docker-compose 2.3 验证安装是否成功: docker-compose --version 3. 在安装插件之前,可以测试端口是否已被占用,以避免编排过程中出错。可以使用以下命令安装netstat并查看端口号是否被占用: yum -y install net-tools netstat -npl | grep 3306 现在,您已经安装Docker安装Docker Compose插件,可以继续进行其他操作,例如上传docker-compose.yml文件到服务器,并在服务器上安装MySQL容器。可以参考Docker的官方文档或其他资源来了解如何使用DockerDocker Compose进行容器的安装和配置。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Docker安装docker-compose插件](https://blog.csdn.net/qq_50661854/article/details/124453329)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Docker安装MySQL docker安装mysql 完整详细教程](https://blog.csdn.net/qq_40739917/article/details/130891879)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值