当前位置: 首页 > 工具软件 > FMDB > 使用案例 >

【iOS】—— FMDB的基础用法

陆建木
2023-12-01

一.基本介绍:

1.简介:

由于iOS中原生的 SQLite API 使用时非常不方便 ,于是就出现了一系列将 SQLite API 进行封装的库,例如FMDB、PlausibleDatabase、sqlitepersistentobjects等,FMDB是一款简洁易用、轻量级的封装库。

2.什么是FMDB

FMDB是iOS平台的SQLite数据库框架。
FMDB以OC的方式封装了SQLite的C语言API。

3.FMDB同时兼容ARC和非ARC工程,会自动根据工程配置来调整相关的内存管理代码。

4.FMDB常用类:

FMDatabase:一个FMDatabase对象就代表一个单独的SQLite数据库用来执行SQL语句。
FMResultSet:使用FMDatabase执行查询后的结果集。
FMDatabaseQueue:用于在多线程中执行多个查询或更新,它是线程安全的。

5.FMDB优点

  • 使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码。
  • 对比苹果自带的Core Data框架,更加轻量级和灵活。
  • 提供了多线程安全的数据库操作方法,有效地防止数据混乱。

6.FMDB缺点

  • 它本身也存在一些问题,比如跨平台,因为它是用oc的语言封装的,所以
    只能在ios开发的时候使用,如果想实现跨平台的操作,来降低开发的成本
    和维护的成本,就需要使用比较原始的SQLite。

7.FMDB的作用:

将你想要保存的数据保存在本地,下次在进入程序的时候保证你想要的数据能在本地找到你想要的数据,然后对程序中需要赋值的地方进行赋值。

二.使用方法:

1.没有配置Cocopads的可以参考这篇文章自己配置:Masonry的简单使用

Cocopads引入 FMDB 库:

pod 'FMDB'

2.不想配置的可以在git上自行下载添加到项目中:

git地址如下:FMDB基础代码

三.核心类:

1.FMDatabase

一个FMDatabase对象就代表一个单独的SQLite数据库,用来执行SQL语句。

2.FMResultSet

使用FMDatabase执行查询后的结果集。

3.FMDatabaseQueue

用于在多线程中执行多个查询或更新,它是线程安全的。

四.FMDB的创建:

FMDB的使用基于FMDB环境的配置成功,你首先要确认自己的环境配置成功了,即项目中有FMDB这个库。

对数据库中存储的每一个值都有一个类型

  1. NULL 这个值为空值
  2. INTEGER 值被标识为整数,依据值的大小可以依次被存储1~8个字节
  3. REAL 所有值都是浮动的数值
  4. TEXT 值为文本字符串
  5. BLOB 值为blob数据

1.添加头文件:

#import "FMDB.h"

2.获得数据库文件的路径:

NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSLog(@"%@", doc);
    NSString *fileName = [doc stringByAppendingPathComponent:@"collectionData.sqlite"];
  • [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]

iPhone会为每一个应用程序生成一个私有目录,这个目录位于:
/Users/sundfsun2009/Library/Application Support/iPhone Simulator/User/Applications下,
并随即生成一个数字字母串作为目录名,在每一次应用程序启动时,这个字母数字串都是不同于上一次。

所以通常使用Documents目录进行数据持久化的保存,而这个Documents目录可以通过:
NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserdomainMask,YES) 得到。

简单的来说这个方法就是获取一个固定路径的,注意的是:NSSearchPathForDirectoriesInDomains方法返回的是一个数组类型的数据,所以这里是获取它返回数组的最后一个元素

  • stringByAppendingPathComponent是路径拼接,会在字符串前自动添加“/”,成为完整路径。

3.获得数据库:

FMDatabase *collectionDatabase = [FMDatabase databaseWithPath:fileName];

4.打开数据库:

if ([collectionDatabase open]) {
}
文件路径有三种情况:

1.具体文件路径
如果不存在会自动创建。

2.空字符串@""
会在临时目录创建一个空的数据库,当FMDatabase连接关闭时,数据库文件也被删除。

3.nil
会创建一个内存中临时数据库,当FMDatabase连接关闭时,数据库会被销毁。

5.创表:

BOOL result = [self.collectionDatabase executeUpdate:@"CREATE TABLE IF NOT EXISTS collectionData (mainLabel text NOT NULL, nameLabel text NOT NULL, imageURL text NOT NULL, networkURL text NOT NULL, dateLabel text NOT NULL, nowLocation text NOT NULL, goodState text NOT NULL, collectionState text NOT NULL, id text NOT NULL);"];
if (result) {
    NSLog(@"创表成功");
} else {
    NSLog(@"创表失败");
}
  • CREATE TABLE IF NOT EXISTS collectionData
    意思是你创建了一个叫做collectionData的数据库,自己创建的话也可以改为自己方便识别的名字。
  • mainLabel text NOT NULL
    意思就是你在刚才的collectionData数据库里边添加了一个text类型的名叫mainLabel的一个索引,其它代码意思也相似。

完整基础操作的代码:

//1.获得数据库文件的路径
    NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSLog(@"%@", doc);
    NSString *fileName = [doc stringByAppendingPathComponent:@"collectionData.sqlite"];
    
    //2.获得数据库
    self.collectionDatabase = [FMDatabase databaseWithPath:fileName];
    
    //3.打开数据库
    if ([self.collectionDatabase open]) {
        BOOL result = [self.collectionDatabase executeUpdate:@"CREATE TABLE IF NOT EXISTS collectionData (mainLabel text NOT NULL, nameLabel text NOT NULL, imageURL text NOT NULL, networkURL text NOT NULL, dateLabel text NOT NULL, nowLocation text NOT NULL, goodState text NOT NULL, collectionState text NOT NULL, id text NOT NULL);"];
        if (result) {
            NSLog(@"创表成功");
        } else {
            NSLog(@"创表失败");
        }
    }

五.FMDB的增删改查:

  • 通常对数据库的操作,我们一般称为CURD,即对表进行创建(Create)、更新(Update)、读取(Read)和删除(Delete)操作。
  • 以下代码的self.collectionDatabase都是之前定义的数据库类型的属性,对数据库的操作有些地方还是和C语言文件操作很相似的,比如打开数据库,关闭数据库的。
  • 在这里调用的execute开头的方法返回的都是BOOL类型的数据,用于判断你调用该方法是否操作成功,成功了就返回1,失败了就返回0。
  • 这里的?就相当于%@也就是下面要输入内容。

1.插入数据

//插入数据
- (void)insertData {
    if ([self.collectionDatabase open]) {
        NSString *string = @"hi world";
        BOOL result = [self.collectionDatabase executeUpdate:@"INSERT INTO collectionData (mainLabel, nameLabel, imageURL, networkURL, dateLabel, nowLocation, goodState, collectionState, id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?);", string, string, string, string, string, string, string, string, string];
        if (!result) {
            NSLog(@"增加数据失败");
        }else{
            NSLog(@"增加数据成功");
        }
        [self.collectionDatabase close];
    }
}
  • INSERT INTO collectionData
    意思是向collectionData数据库中插入数据。后边的第一个括号就是你要赋值的索引,VALUES之后就是你要赋的值,注意要和你想要赋值的索引还有索引数对应,同时也要就是和你当时定义的类型相同。

2.更新数据

// 更新数据
- (void)updateData {
    if ([self.collectionDatabase open]) {
        NSString *sql = @"UPDATE collectionData SET id = ? WHERE nameLabel = ?";
        BOOL result = [self.collectionDatabase executeUpdate:sql, @"1", @"hi world"];
        if (!result) {
            NSLog(@"数据修改失败");
        } else {
            NSLog(@"数据修改成功");
        }
        [self.collectionDatabase close];
    }
}
  • UPDATE collectionData SET id = ? WHERE nameLabel = ?
    意思是更新collectionData中的id索引对应的数据,当WHERE后的nameLabel = ?条件成立的时候。

3.删除数据

// 删除数据
- (void)deleteData {
    if ([self.collectionDatabase open]) {
        NSString *sql = @"delete from collectionData WHERE collectionState = ?";
        BOOL result = [self.collectionDatabase executeUpdate:sql, @"xixixixi"];
        if (!result) {
            NSLog(@"数据删除失败");
        } else {
            NSLog(@"数据删除成功");
        }
        [self.collectionDatabase close];
    }
}
  • delete from collectionData WHERE collectionState = ?
    意思是删除collectionData数据库中的一组数据,当WHERE之后的collectionState = ?条件成立后。

4.查询数据

// 查询数据
- (void)queryData {
    if ([self.collectionDatabase open]) {
        // 1.执行查询语句
        FMResultSet *resultSet = [self.collectionDatabase executeQuery:@"SELECT * FROM collectionData"];
        // 2.遍历结果
        while ([resultSet next]) {
            NSString *mainLabel = [resultSet stringForColumn:@"mainLabel"];
            NSLog(@"mainLabel = %@",mainLabel);
            NSString *nameLabel = [resultSet stringForColumn:@"nameLabel"];
            NSLog(@"nameLabel = %@",nameLabel);
            NSString *imageURL = [resultSet stringForColumn:@"imageURL"];
            NSLog(@"imageURL = %@",imageURL);
            NSString *networkURL = [resultSet stringForColumn:@"networkURL"];
            NSLog(@"networkURL = %@",networkURL);
            NSString *dateLabel = [resultSet stringForColumn:@"dateLabel"];
            NSLog(@"dateLabel = %@",dateLabel);
            NSString *nowLocation = [resultSet stringForColumn:@"nowLocation"];
            NSLog(@"nowLocation = %@",nowLocation);
            NSString *goodState = [resultSet stringForColumn:@"goodState"];
            NSLog(@"goodState = %@",goodState);
            NSString *collectionState = [resultSet stringForColumn:@"collectionState"];
            NSLog(@"collectionState = %@",collectionState);
            NSString *id = [resultSet stringForColumn:@"id"];
            NSLog(@"id = %@",id);
        }
        [self.collectionDatabase close];
    }
}
  • SELECT * FROM collectionData
    选择collectionData中的数据,*处也可以改为WHERE条件。

以上就是我对FMDB的基础了解,如果以后了解到了更多我也会对博客进行相应的补充。

 类似资料: