zoukankan      html  css  js  c++  java
  • sqlite第三方类库FMDB的使用

           FMDB是ios平台下解析sqlite的第三方数据库管理框架,使用非常方便,而且提供了多线程安全的数据库操作,相比coredata来说更加灵活和轻量级。

            fmdb主要有三个类别:

            fmdatabase:用来执行sql语句;

           fmresultset:用来使用fmdatabase执行查询后的结果集合

           fmdatabasequeue:用来在多线程中查询和更新数据,它是线程安全的。

           需要注意的是,在iOS环境下,只有document directory 是可以进行读写的。

    fmdb的使用

    1.在新建的项目中,导入libsqlite3的动态数据库:

    注:(在Building Phases中的Link Binary WithLibraries中添加)

    2.加入第三方框架fmdb中的这些主要文件:

      

    3.在代码中建立一个数据库,并指定文件路径:

     1     //指定沙盒路径
     2     NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
     3     //在指定沙盒路径下添加sqlite文件
     4     NSString *filepath = [path stringByAppendingPathComponent:@"moxue.sqlite"];
     5     //在指定path路径下创建数据库
     6     FMDatabase *db = [FMDatabase databaseWithPath:filepath];
     7     //查看是否打开成功
     8     if (![db open]) {
     9         return;
    10     }else{
    11         NSLog(@"打开成功");
    12     }

    4.在代码中添加列表和列表属性:(表格的参数不能是id(大小写都不可以),否则会出现创建表格失败,因为表格在创建时,表格会自动生成一个id属性)

    1 //在数据库中创建一个列表,并添加列表属性
    2     BOOL result = [db executeUpdate:@"CREATE TABLE IF NOT EXISTS data(id INTEGER PRIMARY KEY AUTOINCREMENT,Title TEXT,date TEXT,Context TEXT,Url TEXT)"];
    3     if (result) {
    4         NSLog(@"创建data表成功");
    5     }else{
    6         NSLog(@"创建data表失败");
    7     }

    注意:(表名不能是变量),否则会创建表格失败或为空,正确的写法为:

    NSString *sql = [NSString stringWithFormat:@"select * from %@", tableName];
    FMResultSet *rs = [db executeQuery:sql];

    5.在列表中插入数据:

    1   //插入数据
    2     BOOL res = [db executeUpdate:@"INSERT INTO data (Title,date,Context,Url) VALUES(?,?,?,?)",@"墨雪",@"2015-10-11",@"我的表格",@"我的Url"];
    3     BOOL res1 = [db executeUpdate:@"INSERT INTO data (Title,date,Context,Url) VALUES(?,?,?,?)",@"刘庆",@"2015-10-10",@"刘庆的表格",@"刘庆的Url"];
    4     if (res1) {
    5         NSLog(@"插入data成功");
    6     }else{
    7         NSLog(@"插入data表失败");
    8     }

    6.在类表中删除数据或者列表:

    1 BOOL dele = [db executeUpdate:@"DROP TABLE IF EXISTS data"];
    2     BOOL dele1 = [db executeUpdate:@"delete from data where Title = '墨雪'"];
    3     if (dele) {
    4         NSLog(@"删除数据成功");
    5     }else{
    6         NSLog(@"删除数据失败");
    7     }

    7.在列表中修改数据:

    1  //修改数据
    2     BOOL UPDATE = [db executeUpdate:@"update data SET Title = '哈哈' WHERE id = 1" ];
    3     if (UPDATE) {
    4         NSLog(@"修改成功");
    5     }else{
    6         NSLog(@"修改失败");
    7     }

    8.在列表中查询数据:

    1  //查询数据
    2     FMResultSet *RS = [db executeQuery:@"SELECT Title from data"];
    3     while ([RS next]) {
    4         NSString *name = [RS stringForColumn:@"Title"];
    5         NSLog(@"%@",name);
    6     }

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

     1  FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:filepath];
     2     dispatch_queue_t myq1 = dispatch_queue_create("myqueue1", nil);
     3     dispatch_async(myq1, ^{
     4        [queue inDatabase:^(FMDatabase *db) {
     5            FMResultSet *RS = [db executeQuery:@"SELECT Title from data"];
    //NSString *address = [db stringForQuery:@"SELECT Address FROM PersonList WHERE Name = ?",@"John”];
    6 while ([RS next]) { 7 NSString *name = [RS stringForColumn:@"Title"]; 8 NSLog(@"%@",name); 9 } 10 11 }]; 12 });

    10.关闭数据库

     1 [db close];  

    11.另外 FMResultSet 还提供了很多方法来获得所需的格式的值:

        intForColumn:
        longForColumn:
        longLongIntForColumn:
        boolForColumn:
        doubleForColumn:
        stringForColumn:
        dataForColumn:
        dataNoCopyForColumn:
        UTF8StringForColumnIndex:
        objectForColumn:
    12.fmda在存储的过程中,传给execute方法的参数必须是NSObject,如果是int,float等需要先将数据进行包装,否则传过去的数据要么为null要么导致程序crash。正确的写法应该是:
    FMResultSet *rs = [db executeQuery:sql, [NSNumber numberWithLong:mynum];
  • 相关阅读:
    hdu 1015 Safecracker 暴力搜索
    hdu 1239 Calling Extraterrestrial Intelligence Again 枚举
    hdu 3747 Download 菜鸟杯
    hdu 3744 A Runing Game 菜鸟杯
    Request.QueryString 使用时候应该注意的地方。
    图片 上一张 下一张 链接效果
    ASP.NET 输出缓存的移除
    RSS 消费
    RSS 订阅功能的实现
    创建型模式单件模式(1)
  • 原文地址:https://www.cnblogs.com/moxuexiaotong/p/4870438.html
Copyright © 2011-2022 走看看