09.iOS FMDB的基本使用

作者: Liwx | 来源:发表于2016-01-16 01:38 被阅读7725次

    @(〓〓 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);
            }
        }];
        
        
    }
    

    相关文章

      网友评论

      • boxKUn:请问是用哪个类的?感觉两个一样啊
      • 白鹿Divella:我想问具体导入了FMDB的那几个文件,因为我下载下来好多,又不知道如何下手。如果方便,不知道能给我说下不
        DEVIL6666: 写的相当不错
        瘦子书生:@唐僧用飘柔 谢谢了
        唐僧用飘柔:@白鹿Divella 直接拖进去

      本文标题:09.iOS FMDB的基本使用

      本文链接:https://www.haomeiwen.com/subject/gqphkttx.html