• 本地缓存FMDB的使用(iOS)


    一、简单说明

    1.什么是FMDB

    FMDB是iOS平台的SQLite数据库框架

    FMDB以OC的方式封装了SQLite的C语言API

    2.FMDB的优点

    使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码

    对比苹果自带的Core Data框架,更加轻量级和灵活

    提供了多线程安全的数据库操作方法,有效地防止数据混乱

    3.FMDB的github地址

    https://github.com/ccgus/fmdb

    二、核心类

    FMDB有三个主要的类

    (1)FMDatabase

    一个FMDatabase对象就代表一个单独的SQLite数据库

    用来执行SQL语句

    (2)FMResultSet

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

    (3)FMDatabaseQueue

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

    三、打开数据库

    通过指定SQLite数据库文件路径来创建FMDatabase对象

    FMDatabase *db = [FMDatabase databaseWithPath:path];

    if (![db open]) {

        NSLog(@"数据库打开失败!");

    }

    文件路径有三种情况

    (1)具体文件路径

      如果不存在会自动创建

    (2)空字符串@""

      会在临时目录创建一个空的数据库

      当FMDatabase连接关闭时,数据库文件也被删除

    (3)nil

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

    四、执行更新

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

    create、drop、insert、update、delete等

    使用executeUpdate:方法执行更新

    - (BOOL)executeUpdate:(NSString*)sql, ...

    - (BOOL)executeUpdateWithFormat:(NSString*)format, ...

    - (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments

    示例

    [db executeUpdate:@"UPDATE t_student SET age = ? WHERE name = ?;", @20, @"Jack"]

    五、执行查询

    查询方法

    - (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"];

    }

     六、代码

    1什在日常的开发中,我们需要用到离线缓存将数据信息存入数据库,在没有网络的时候进行加载,而我们IOS用的就是sqlite3数据库,用原生的sql我们也能实现,但是书写起来比较麻烦,尤其是其它语言转过来的程序员会感觉吃力,下面我们介绍一款比较优秀还简单的第三方FMDB

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

    3在FMDB下载文件后,工程中必须导入如下文件,并使用 libsqlite3.dylib 依赖包

    4 FMDB常用类

    FMDatabase : 一个单一的SQLite数据库,用于执行SQL语句。

    FMResultSet :执行查询一个FMDatabase结果集。

    FMDatabaseQueue :在多个线程来执行查询和更新时会使用这个类

    5操作数据库

    1 创建并且打开数据库

       // 1 获取数据库对象
        NSString *path=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
        path=[path stringByAppendingPathComponent:@"test.sqlite"];
        
         dataBase=[FMDatabase databaseWithPath:path];
        // 2 打开数据库,如果不存在则创建并且打开
        BOOL open=[dataBase open];
        if(open){
            NSLog(@"数据库打开成功");
    }
      //3 创建表
        NSString * create1=@"create table if not exists t_user(id integer autoincrement primary key,name varchar)";
       BOOL c1= [dataBase executeUpdate:create1];
        if(c1){
            NSLog(@"创建表成功");
        }
      //4 插入数据
        NSString * insertSql=@"insert into t_user(id,name) values(?,?)";
        
    //    插入语句1
        bool inflag1=[dataBase executeUpdate:insertSql,@(2),@"admin"];
        
    //    插入语句2
        bool inflag2=[dataBase executeUpdate:insertSql withArgumentsInArray:@[@"admin",@(5)]];
        
    //    插入语句3
        bool inflag3=[dataBase executeUpdateWithFormat:@"insert into t_user(id,name) values(%@,%d)",@"admin",6];
       //    删除语句
        NSString * delete=@"delete from t_user";
        BOOL dflag= [dataBase executeUpdate:delete];
        if(dflag){
            NSLog(@"删除成功");
        }
       //    修改语句
        NSString *update=@" update t_user set name=? ";
        BOOL flag=  [dataBase executeUpdate:update,@"zhangsan"];
        if(flag){
            NSLog(@"修改成功");
    }
    
    
    //    5查询数据FMDB的FMResultSet提供了多个方法来获取不同类型的数据
    
    
    NSString * sql=@" select * from t_user ";
    FMResultSet *result=[dataBase executeQuery:sql];
    while(result.next){
    int ids=[result intForColumn:@"id"];
    NSString * name=[result stringForColumn:@"name"];
    int ids=[result intForColumnIndex:0];
    NSString * name=[result stringForColumnIndex:1];
    NSLog(@"%@,%d",name,ids);     
        }
    

    如果应用中使用了多线程操作数据库,那么就需要使用FMDatabaseQueue来保证线程安全了。 应用中不可在多个线程中共同使用一个FMDatabase对象操作数据库,这样会引起数据库数据混乱。 为了多线程操作数据库安全,FMDB使用了FMDatabaseQueue,使用FMDatabaseQueue很简单,首先用一个数据库文件地址来初使化FMDatabaseQueue,然后就可以将一个闭包(block)传入inDatabase方法中。 在闭包中操作数据库,而不直接参与FMDatabase的管理

    //2多线程操作
          NSString *path=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
        path=[path stringByAppendingPathComponent:@"test.sqlite"];
    
        FMDatabaseQueue * queue=[FMDatabaseQueue databaseQueueWithPath:path];
        [queue inDatabase:^(FMDatabase *db) {
            NSString * create=@"create table if not exists t_book(id integer,name varchar)";
            BOOL c1= [db executeUpdate:create];
            if(c1){
                NSLog(@"成功");
            }
    
        }];
        
        [queue inDatabase:^(FMDatabase *db) {
                NSString * insertSql=@"insert into t_book(id,name) values(?,?)";
            
              //插入语句1
                bool inflag=[db executeUpdate:insertSql,@(2),@"admin"];
               if(inflag){
                   NSLog(@"插入成功");
               }
    
        }];
        
        
        [queue inDatabase:^(FMDatabase *db) {
           
            FMResultSet * data=[db executeQuery:@" select * from t_book "];
            
            while (data.next) {
                
                int ids=[data intForColumn:@"id"];
                NSString *name=[data stringForColumn:@"name"];
                NSLog(@"%@",name);
                NSLog(@"%i",ids);   
            }
        }];
  • 相关阅读:
    构建之法阅读笔记05
    第十一周的学习进度条
    第十周的学习进度条
    第九周的学习进度条
    UI分析之石家庄铁道大学官网
    个人工作总结10
    个人工作总结09
    Lua 笔记16
    Lua 笔记15
    Lua 笔记14
  • 原文地址:https://www.cnblogs.com/Yun-Longcom/p/6008724.html
Copyright © 2020-2023  润新知