【iOS】—— FMDB的基础用法

一.基本介绍:

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

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

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

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

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

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

二.使用方法:

Cocopads引入 FMDB 库:

pod 'FMDB'

三.核心类:

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

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

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

四.FMDB的创建:

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

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

  1. NULL 这个值为空值
  2. INTEGER 值被标识为整数,依据值的大小可以依次被存储1~8个字节
  3. REAL 所有值都是浮动的数值
  4. TEXT 值为文本字符串
  5. BLOB 值为blob数据
#import "FMDB.h"
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是路径拼接,会在字符串前自动添加”/”,成为完整路径。
FMDatabase *collectionDatabase = [FMDatabase databaseWithPath:fileName];
if ([collectionDatabase open]) {
}

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

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

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

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的一个索引,其它代码意思也相似。

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

    self.collectionDatabase = [FMDatabase databaseWithPath:fileName];

    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。
  • 这里的 ?就相当于 %@也就是下面要输入内容。

- (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之后就是你要赋的值,注意要和你想要赋值的索引还有索引数对应,同时也要就是和你当时定义的类型相同。

- (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 = ?条件成立的时候。

- (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 = ?条件成立后。

- (void)queryData {
    if ([self.collectionDatabase open]) {

        FMResultSet *resultSet = [self.collectionDatabase executeQuery:@"SELECT * FROM collectionData"];

        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的基础了解,如果以后了解到了更多我也会对博客进行相应的补充。

Original: https://blog.csdn.net/m0_55124878/article/details/121256824
Author: 西邮郭富城
Title: 【iOS】—— FMDB的基础用法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/816111/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球