iOS-数据存储之FMDB

本文介绍FMDB,一种基于SQLite的轻量级数据存储API。它简化了SQLite的复杂操作,提供了面向对象的方法来处理数据库任务。文章详细讲解了FMDB的基本用法,包括安装、主要类的功能及使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

FMDB是一套OC语言,面向对象,基于SQLite,轻量级的数据存储API,
因其操作简单,避免了SQLite复杂的C语言编程,被广泛应用。

FMDB的github地址:
https://github.com/ccgus/fmdb


CocoaPods 安装:

pod 'FMDB'

手动安装:

将FMDB文件夹直接拖到工程内
由于FMDB是基于SQLite的,所以需手动导入 libsqlite3.0.tbd 框架

这里写图片描述


FMDB的优点

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

FMDB有三个主要的类

  • FMDatabase

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

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

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

在FMDB中,除查询以外的所有操作,都称为“更新”

使用executeUpdate:方法执行更新

  • (BOOL)executeUpdate:(NSString*)sql, …
  • (BOOL)executeUpdateWithFormat:(NSString*)format, …
  • (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments

查询方法

  • (FMResultSet )executeQuery:(NSString)sql, …
  • (FMResultSet )executeQueryWithFormat:(NSString)format, …
  • (FMResultSet )executeQuery:(NSString )sql withArgumentsInArray:(NSArray *)arguments
// 查询数据
FMResultSet *rs = [db executeQuery:@"SELECT * FROM t_person"];

// 遍历结果集
while ([rs next]) {
    NSString *name  = [rs stringForColumn:@"name"];
    int age         = [rs intForColumn:@"age"];
    double height   = [rs doubleForColumn:@"height"];
}

FMDatabase这个类是线程不安全的,如果在多个线程中同时使用一个FMDatabase实例,会造成数据混乱等问题

为了保证线程安全,FMDB提供方便快捷的FMDatabaseQueue类

FMDatabaseQueue的创建
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:path];

简单使用
[queue inDatabase:^(FMDatabase *db) {

    [db executeUpdate:@"INSERT INTO t_person(name) VALUES (?)", @"Aria"];
    [db executeUpdate:@"INSERT INTO t_person(name) VALUES (?)", @"Alice"];
    [db executeUpdate:@"INSERT INTO t_person(name) VALUES (?)", @"Maya"];

    FMResultSet *rs = [db executeQuery:@"select * from t_person"];
    while ([rs next]) {
        // …
    }
}];

举例说明
    // 获取存储路径
    NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;

    // 拼接存储路径
    NSString *dataPath = [docPath stringByAppendingPathComponent:@"kids.sqlite"];

    // 初始化 FMDatabase
    FMDatabase *db = [FMDatabase databaseWithPath:dataPath];

    // 打开数据库
    [db open];

    // 创建表格
    [db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_kids (id integer PRIMARY KEY, name TEXT NOT NULL,sex text,age INTEGER,height REAL)"];

    // 添加数据
    [db executeUpdateWithFormat:@"INSERT INTO t_kids (name,sex,age,height) VALUES (%@,%@,%ld,%f)",'Vivian','female',18,165.0];

    // 通过单一属性删除数据
    [_db executeUpdate:@"DELETE FROM t_kids where name = ?",'Nora'];

    // 删除所有数据
    [_db executeUpdate:@"DELETE FROM t_kids"];

    // 查询单个数据
    FMResultSet *set = [_db executeQuery:@"SELECT *FROM t_kids where name = ?;",'Lily'];
    while (set.next) {
        NSString *name = [set stringForColumn:@"name"];
        NSString *sex  = [set stringForColumn:@"sex"];
        NSInteger age  = [set intForColumn:@"age"];
        double height  = [set doubleForColumn:@"height"];
    }

    // 查询所有数据
    FMResultSet *set = [_db executeQuery:@"SELECT *FROM t_kids;"];
    while (set.next) {
        ...
    }

从FMResultSet中取值的主要方法:

    intForColumn:   //整型
    longLongIntForColumn: //长整型
    boolForColumn:  //布尔
    doubleForColumn://浮点型
    stringForColumn:// 字符型
    dateForColumn:  // 日期
    dataForColumn:  // 二进制
    objectForColumnName: // 对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值