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'

  • 2.手动集成
    • 1.下载FMDB框架
      FMDB GitHub链接: https://github.com/ccgus/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框架文件夹拖入工程
09.iOS FMDB的基本使用_第1张图片
01.将fmdb框架文件夹拖入工程.png

  • 3.添加系统依赖库sqlite3.0.tbd
09.iOS FMDB的基本使用_第2张图片
2.添加系统依赖库sqlite3.0.tbd.png

  • 4.导入FMDB.h头文件,编译成功.集成FMDB完成
09.iOS FMDB的基本使用_第3张图片
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);
        }
    }];
    
    
}

你可能感兴趣的:(09.iOS FMDB的基本使用)