09.iOS FMDB的基本使用

@(〓〓 iOS-实用技术)[SQLite 数据库]


目录

  • 09.iOS FMDB的基本使用
  • 1.FMDB基本使用
    • FMDB简介
    • FMDB的安装方式
    • FMDB核心类
      • FMDatabase数据库
      • FMResultSet查询结果集
      • FMDatabaseQueue线程安全数据库操作
    • FMDB使用步骤
  • 2.FMDabaseQueue的简单使用
    • FMDabaseQueue简介
    • FMDabaseQueue的使用
  • 3.FMDB FMDatabase类的简单使用
    • 手动集成FMDB步骤
    • 创建数据库和数据表基本步骤
    • FMDatabase数据库的增删改查(CRUD)
  • 4.FMDatabaseQueue数据库队列基本使用
    • 使用FMDatabaseQueue创建数据库
    • FMDatabaseQueue队列数据库的增删改查(CRUD)

1.FMDB基本使用

FMDB简介

  • 1.什么是FMDB?

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

  • 2.FMDB有什么优势?

使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码
提供了多线程安全的数据库操作方法,有效地防止数据混乱

FMDB的安装方式

  • 1.Cocoapods

pod 'FMDB'

1.导入FMDB文件
2.导入系统依赖库sqlite3.0.tbd


FMDB核心类

FMDatabase数据库

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

FMResultSet查询结果集

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

FMDatabaseQueue线程安全数据库操作

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


FMDB使用步骤

  • 1.打开数据库
    通过指定SQLite数据库文件路径来创建FMDatabase对象

    • 具体文件路径

    如果不存在会自动创建.

    • 空字符串@""

    会在临时目录创建一个空的数据库当FMDatabase连接关闭时,数据库文件也被删除

    • nil

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

// 1.打开数据库
FMDatabase *db = [FMDatabase databaseWithPath:path];
if ([db open])  { NSLog(@"打开成功!"); }

  • 2.执行更新

在FMDB中,除查询以外的所有操作,都称为“更新”
create、drop、insert、update、delete
使用executeUpdate:方法执行更新

// FMDB更新方法
-(BOOL)executeUpdate:(NSString)sql, ...
-(BOOL)executeUpdateWithFormat:(NSString
)format, ...
-(BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments

  • 执行更新示例:
// 2.执行更新
[db executeUpdate:@"UPDATE t_student SET age = ? WHERE name = ?;", @20, @"Jack"]

  • 3.执行查询
    • 查询方法
    - (FMResultSet *)executeQuery:(NSString*)sql, ...
    - (FMResultSet *)executeQueryWithFormat:(NSString*)format, ...
    - (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments
  • 执行查询示例:
// 查询数据
FMResultSet *rs = [db executeQuery:@"SELECT * FROM t_student"];

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

  • 4.关闭数据库
[self.db close];

2.FMDabaseQueue的简单使用

FMDabaseQueue简介

FMDatabase这个类是线程不安全的,如果在多个线程中同时使用一个FMDatabase实例,会造成数据混乱等问题
为了保证线程安全,FMDB提供方便快捷的FMDatabaseQueue类

FMDabaseQueue的使用

  • 1.FMDatabaseQueue的使用
    FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:path];
简单使用
    [queue inDatabase:^(FMDatabase *db) {
        [db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jack"];
        // 查询
        FMResultSet *rs = [db executeQuery:@"select * from t_student"];
    }];
使用事务
    [queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
        [db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jack"];
        //查询
        FMResultSet *rs = [db executeQuery:@"select * from t_student"];
    }];

3.FMDB FMDatabase类的简单使用


手动集成FMDB步骤

  • 1.下载FMDB框架

FMDB GitHub链接: https://github.com/ccgus/fmdb

  • 2.将fmdb框架文件夹拖入工程
01.将fmdb框架文件夹拖入工程.png

  • 3.添加系统依赖库sqlite3.0.tbd
2.添加系统依赖库sqlite3.0.tbd.png

  • 4.导入FMDB.h头文件,编译成功.集成FMDB完成
3.导入FMDB.h头文件.png

创建数据库和数据表基本步骤

  • 1.拼接数据库存储的沙盒路径
  • 2.通过路径创建数据库
  • 3.打开数据库
    • 如果成功打开数据库后,创建数据表.

  • 创建数据库和数据表参考代码

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 0.拼接数据库存放的沙盒路径
    NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
    NSString *sqlFilePath = [path stringByAppendingPathComponent:@"student.sqlite"];
    
    // 1.通过路径创建数据库
    self.db = [FMDatabase databaseWithPath:sqlFilePath];
    
    // 2.打开数据库
    if ([self.db open]) {
        NSLog(@"打开成功");
        
        BOOL success = [self.db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER DEFAULT 1)"];
        
        if (success) {
            NSLog(@"创建表成功");
        } else {
            NSLog(@"创建表失败");
        }
        
    } else {
        NSLog(@"打开失败");
    }
}

FMDatabase数据库的增删改查(CRUD)

  • 1.插入数据
// 插入数据
static NSInteger age = 10;
age++;

BOOL success = [self.db executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?, ?);", @"jack", @(age)];

if (success) {
    NSLog(@"插入成功");
} else {
    NSLog(@"插入失败");
}
  • 2.删除数据
// 删除数据
BOOL success = [self.db executeUpdate:@"DELETE FROM t_student WHERE age > 20 AND age < 25;"];
  • 3.修改数据
// 修改数据
BOOL success = [self.db executeUpdate:@"UPDATE t_student SET name = 'liwx' WHERE age > 12 AND age < 15;"];
  • 4.查询数据
// 查询数据
FMResultSet *result = [self.db executeQuery:@"SELECT id, name, age FROM t_student WHERE age > 25;"];

while ([result next]) {
    int ID = [result intForColumnIndex:0];
    NSString *name = [result stringForColumnIndex:1];
    int age = [result intForColumn:@"age"];
    
    NSLog(@"ID: %zd, name: %@, age: %zd", ID, name, age);
}

4.FMDatabaseQueue数据库队列基本使用

使用FMDatabaseQueue类在多线程中执行多个查询或更新是线程安全的.

使用FMDatabaseQueue创建数据库

  • 1.创建一个FMDatabaseQueue对象

只要成功创建数据库队列对象,FMDB内部就会自动给我们加载数据库对象.无需再执行打开数据库操作.

  • 2.使用block传递数据库

使用 inDatabase:方法传递数据库对象.

  • 3.使用SQL语句创建数据表
- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 0.拼接数据库存放的沙盒路径
    NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
    NSString *sqlFilePath = [path stringByAppendingPathComponent:@"student.sqlite"];
    
    // 1.创建一个FMDatabaseQueue对象
    // 只要创建数据库队列对象, FMDB内部就会自动给我们加载数据库对象
    self.dbQueue = [FMDatabaseQueue databaseQueueWithPath:sqlFilePath];
    
    // 2.执行操作
    // 会通过block传递队列中创建好的数据库
    [self.dbQueue inDatabase:^(FMDatabase *db) {
        
        BOOL success = [db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER DEFAULT 1);"];
        
        if (success) {
            NSLog(@"创建表成功");
        } else {
            NSLog(@"创建表失败");
        }
        
    }];
    
}

FMDatabaseQueue队列数据库的增删改查(CRUD)

  • 1.插入数据
- (IBAction)insertClick {
    
    static NSInteger age = 10;
    age++;
    
    [self.dbQueue inDatabase:^(FMDatabase *db) {
        
        BOOL success = [db executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?, ?);", @"jack", @(age)];
        
        if (success) {
            NSLog(@"插入成功");
        } else {
            NSLog(@"插入失败");
        }
    }];
    
}
  • 2.删除数据
// 删除数据
[self.dbQueue inDatabase:^(FMDatabase *db) {
    
    BOOL success = [db executeUpdate:@"DELETE FROM t_student WHERE age > 20 AND age < 25;"];
        
    // 判断是否SQL是否执行成功   
    // ...
}
  • 3.修改数据
// 修改数据
[self.dbQueue inDatabase:^(FMDatabase *db) {
        
    BOOL success = [db executeUpdate:@"UPDATE t_student SET name = 'liwx' WHERE age > 12 AND age < 15;"];
    
    // 判断是否SQL是否执行成功  
    // ...
}
  • 4.查询数据
// 查询数据
- (IBAction)queryClick {
    
    [self.dbQueue inDatabase:^(FMDatabase *db) {
        
        FMResultSet *result = [db executeQuery:@"SELECT id, name, age FROM t_student WHERE age > 25;"];
        
        while ([result next]) {
            int ID = [result intForColumnIndex:0];
            NSString *name = [result stringForColumnIndex:1];
            int age = [result intForColumn:@"age"];
            
            NSLog(@"ID: %zd, name: %@, age: %zd", ID, name, age);
        }
    }];
    
    
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容