zoukankan      html  css  js  c++  java
  • FMDB的使用总结

      iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便。于是,就出现了一系列将SQLite API进行封装的库,例如FMDB、PlausibleDatabase、sqlitepersistentobjects等,FMDB (https://github.com/ccgus/fmdb) 是一款简洁、易用的封装库,这一篇文章简单介绍下FMDB的使用。

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

    FMDB同时兼容ARC和非ARC工程,会自动根据工程配置来调整相关的内存管理代码。

    FMDB常用类:

    FMDatabase : 一个单一的SQLite数据库,用于执行SQL语句。
    FMResultSet :执行查询一个FMDatabase结果集,这个和android的Cursor类似。
    FMDatabaseQueue :在多个线程来执行查询和更新时会使用这个类。

    创建数据库:

     

             db = [FMDatabase databaseWithPath:database_path];  


             1、当数据库文件不存在时,fmdb会自己创建一个。

             2、 如果你传入的参数是空串:@"" ,则fmdb会在临时文件目录下创建这个数据库,数据库断开连接时,数据库文件被删除。

             3、如果你传入的参数是 NULL,则它会建立一个在内存中的数据库,数据库断开连接时,数据库文件被删除。

    打开数据库:

     
    1. [db open]  


    返回BOOL型。

    关闭数据库:

     
    1. [db close]  

    数据库增删改等操作:

    除了查询操作,FMDB数据库操作都执行executeUpdate方法,这个方法返回BOOL型。

    看一下例子:

    创建表:

     
    1. if ([db open]) {  
    2.         NSString *sqlCreateTable =  [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS '%@' ('%@' INTEGER PRIMARY KEY AUTOINCREMENT, '%@' TEXT, '%@' INTEGER, '%@' TEXT)",TABLENAME,ID,NAME,AGE,ADDRESS];  
    3.         BOOL res = [db executeUpdate:sqlCreateTable];  
    4.         if (!res) {  
    5.             NSLog(@"error when creating db table");  
    6.         } else {  
    7.             NSLog(@"success to creating db table");  
    8.         }  
    9.         [db close];  
    10.   
    11.     }  



    添加数据

     
    1. if ([db open]) {  
    2.        NSString *insertSql1= [NSString stringWithFormat:  
    3.                               @"INSERT INTO '%@' ('%@', '%@', '%@') VALUES ('%@', '%@', '%@')",  
    4.                               TABLENAME, NAME, AGE, ADDRESS, @"张三", @"13", @"济南"];  
    5.        BOOL res = [db executeUpdate:insertSql1];  
    6.        NSString *insertSql2 = [NSString stringWithFormat:  
    7.                                @"INSERT INTO '%@' ('%@', '%@', '%@') VALUES ('%@', '%@', '%@')",  
    8.                                TABLENAME, NAME, AGE, ADDRESS, @"李四", @"12", @"济南"];  
    9.        BOOL res2 = [db executeUpdate:insertSql2];  
    10.          
    11.        if (!res) {  
    12.            NSLog(@"error when insert db table");  
    13.        } else {  
    14.            NSLog(@"success to insert db table");  
    15.        }  
    16.        [db close];  
    17.   
    18.    }  



    修改数据:

                      if ([db open]) {  

    1.         NSString *updateSql = [NSString stringWithFormat:  
    2.                                @"UPDATE '%@' SET '%@' = '%@' WHERE '%@' = '%@'",  
    3.                                TABLENAME,   AGE,  @"15" ,AGE,  @"13"];  
    4.         BOOL res = [db executeUpdate:updateSql];  
    5.         if (!res) {  
    6.             NSLog(@"error when update db table");  
    7.         } else {  
    8.             NSLog(@"success to update db table");  
    9.         }  
    10.         [db close];  
    11.   
    12.     }  



    删除数据:

     
    1. if ([db open]) {  
    2.           
    3.         NSString *deleteSql = [NSString stringWithFormat:  
    4.                                @"delete from %@ where %@ = '%@'",  
    5.                                TABLENAME, NAME, @"张三"];  
    6.         BOOL res = [db executeUpdate:deleteSql];  
    7.           
    8.         if (!res) {  
    9.             NSLog(@"error when delete db table");  
    10.         } else {  
    11.             NSLog(@"success to delete db table");  
    12.         }  
    13.         [db close];  
    14.   
    15.     }  



    数据库查询操作:

    查询操作使用了executeQuery,并涉及到FMResultSet。

     
    1. if ([db open]) {  
    2.         NSString * sql = [NSString stringWithFormat:  
    3.                           @"SELECT * FROM %@",TABLENAME];  
    4.         FMResultSet * rs = [db executeQuery:sql];  
    5.         while ([rs next]) {  
    6.             int Id = [rs intForColumn:ID];  
    7.             NSString * name = [rs stringForColumn:NAME];  
    8.             NSString * age = [rs stringForColumn:AGE];  
    9.             NSString * address = [rs stringForColumn:ADDRESS];  
    10.             NSLog(@"id = %d, name = %@, age = %@  address = %@", Id, name, age, address);  
    11.         }  
    12.         [db close];  
    13.     }  

    FMDB的FMResultSet提供了多个方法来获取不同类型的数据:

    数据库多线程操作:

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

     
      1. FMDatabaseQueue * queue = [FMDatabaseQueue databaseQueueWithPath:database_path];  
      2.    dispatch_queue_t q1 = dispatch_queue_create("queue1", NULL);  
      3.    dispatch_queue_t q2 = dispatch_queue_create("queue2", NULL);  
      4.      
      5.    dispatch_async(q1, ^{  
      6.        for (int i = 0; i < 50; ++i) {  
      7.            [queue inDatabase:^(FMDatabase *db2) {  
      8.                  
      9.                NSString *insertSql1= [NSString stringWithFormat:  
      10.                                       @"INSERT INTO '%@' ('%@', '%@', '%@') VALUES (?, ?, ?)",  
      11.                                       TABLENAME, NAME, AGE, ADDRESS];  
      12.                  
      13.                NSString * name = [NSString stringWithFormat:@"jack %d", i];  
      14.                NSString * age = [NSString stringWithFormat:@"%d", 10+i];  
      15.                  
      16.                  
      17.                BOOL res = [db2 executeUpdate:insertSql1, name, age,@"济南"];  
      18.                if (!res) {  
      19.                    NSLog(@"error to inster data: %@", name);  
      20.                } else {  
      21.                    NSLog(@"succ to inster data: %@", name);  
      22.                }  
      23.            }];  
      24.        }  
      25.    });  
      26.      
      27.    dispatch_async(q2, ^{  
      28.        for (int i = 0; i < 50; ++i) {  
      29.            [queue inDatabase:^(FMDatabase *db2) {  
      30.                NSString *insertSql2= [NSString stringWithFormat:  
      31.                                       @"INSERT INTO '%@' ('%@', '%@', '%@') VALUES (?, ?, ?)",  
      32.                                       TABLENAME, NAME, AGE, ADDRESS];  
      33.                  
      34.                NSString * name = [NSString stringWithFormat:@"lilei %d", i];  
      35.                NSString * age = [NSString stringWithFormat:@"%d", 10+i];  
      36.                  
      37.                BOOL res = [db2 executeUpdate:insertSql2, name, age,@"北京"];  
      38.                if (!res) {  
      39.                    NSLog(@"error to inster data: %@", name);  
      40.                } else {  
      41.                    NSLog(@"succ to inster data: %@", name);  
      42.                }  
      43.            }];  
      44.        }  
      45.    });  
    感谢您的访问! 若对您有帮助或有兴趣请关注博客:http://www.cnblogs.com/Rong-Shengcom/
  • 相关阅读:
    88. Merge Sorted Array
    87. Scramble String
    86. Partition List
    85. Maximal Rectangle
    84. Largest Rectangle in Histogram
    83. Remove Duplicates from Sorted List
    82. Remove Duplicates from Sorted List II
    81. Search in Rotated Sorted Array II
    80. Remove Duplicates from Sorted Array II
    计算几何——点线关系(叉积)poj2318
  • 原文地址:https://www.cnblogs.com/Rong-Shengcom/p/5275955.html
Copyright © 2011-2022 走看看