FMDB的简单使用(一)

第一次使用FMDB这个库,所以在这做一点备注。在这之前我也尝试使用coreData。尽管在使用之前已经做好心理准备,但是也被他的复杂步骤虐到了。主要是对C的一知半解。。。

API理解

  • FMDatabase
    这个最直接的理解就是代表一个SQLite数据库。

    //引用官方代码
    NSString *path = [NSTemporaryDirectory() stringByAppendingPathComponent:@"tmp.db"];
    FMDatabase *db = [FMDatabase databaseWithPath:path];
    

    这里要注意的是FMDB会自动判断数据库是否存在,如果不存在就自动创建爱你。就是说我们不必通过NSFileManager 判断sqlite文件是否存在,再创建数据库。

  • FMResultSet
    表示在FMDatabase查询的结果集

    FMResultSet *sresults = [db executeQuery:@"SELECT COUNT(*) FROM myTable"];
     while ([results next]) {
          ScoreModel *model = [ScoreModel new];
          model.score = [results intForColumn:@"score"];
          model.time = [results stringForColumn:@"time"];
      }
    

    在尝试访问查询中返回的值之前,您必须始终调用 - [FMResultSet next],即使 您只希望得到一个值(直接就是官方翻译了。。)
    对于查询到的数据,通过以下的AIP转换为OC的数据类型

    intForColumn:
    longForColumn:
    longLongIntForColumn:
    boolForColumn:
    doubleForColumn:
    stringForColumn:
    dateForColumn:
    dataForColumn:
    dataNoCopyForColumn:
    UTF8StringForColumn:
    objectForColumn:

  • FMDatabaseQueue
    如果你想在多个线程上执行查询和更新,你会想要使用这个类。它在下面的“线程安全”一节中有描述。(就是说你要多线程,异步查询请用这个类)

    FMDatabaseQueue *queue = [FMDatabaseQueue   databaseQueueWithPath:aPath];
    

    关于这个类,由于这次使用得东西比较简单,所以我并没有使用这个类。但是,我看过别人封装的工具类,以及结合GitHub上的文档,记录一下自己的理解吧(如果有错误的地方请指正)

    1.关于上面该类的创建方法,有一点我是不确实是否会自动检测数据库是否存在的,但是GitHub上只给出这一句,按照我的理解应该和FMDatabase一样,如果文件不存在,就自动创建(有待验证)
    2.FMDatabaseQueue 采用Block的方式进行数据库的操作

    [queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
      [db executeUpdate:@"INSERT INTO myTable VALUES (?)", @1];
      [db executeUpdate:@"INSERT INTO myTable VALUES (?)", @2];
      [db executeUpdate:@"INSERT INTO myTable VALUES (?)", @3];
    
      if (whoopsSomethingWrongHappened) {
          *rollback = YES;
          return;
      }
    
      // etc ...
      }];
    

    3.从上面的方法中可以看出,FMDatabaseQueue会为我们自动创建数据库,并对数据库进行管理(就是说我们不用手动对数据库进行[db open]、 [db close])

    这里要说明的是,我们直接操作FMDatabase的时候 记得[db open]后再对数据进行操作,当我们完成查询或者更新操作后,执行[db close] 释放资源

自己遇到的坑

  • 数据库的创建
    我自己在创建数据库路径的时候发生一个比较尴尬的地方

    //正确
      NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,   NSUserDomainMask, true) firstObject];
      NSString *filePath = [documentPath stringByAppendingPathComponent:@"score.sqlite"];
    
      //错误
    NSString *filePath = [documentPath stringByAppendingString:@"score.sqlite"];
    

    路径拼接错误!!!!

  • 数据插入

    BOOL success = [_db executeUpdate:@"INSERT INTO scores(score,time) values(?,?)",@(model.score),model.time];
    

    这里要注意的地方时,传值的时候一定要转换为对象,否则FMDB在运行的时候报错(错误处理能力强的别喷我)

  • 数据库打开关闭
    上文也有提及到,直接操作FMDatabase的时候,一定要记得 判断 数据库是否已经打开,在查询或者更新执行完毕后请执行 [db close]以释放资源

  • 查询和更新
    任何不是SELECT语句的SQL语句都有资格作为更新。这包括CREATE,UPDATE,INSERT,ALTER,COMMIT,BEGIN,DETACH,DELETE,DROP,END,EXPLAIN,VACUUM和REPLACE语句(还有更多)。基本上,如果你的SQL语句不是以SELECT开头的,它是一个更新语句

executeQuery --查询
executeUpdate --更新

以上是本人自己的一点踩坑记录,如果有错误的地方请指正

你可能感兴趣的:(FMDB的简单使用(一))