SQLite3 FMDB三方

作者: 凌晨四点的洛杉矶 | 来源:发表于2015-12-26 20:59 被阅读241次

Github 地址: FMDB

由于 SQLite3 使用比较麻烦, 所以推荐使用第三方开源库FMDB , 他以 OC 的方式封装了SQLite 的C 语言 API.

优点:

  • 使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码
  • 对比苹果自带的Core Data框架,更加轻量级和灵活
  • 提供了多线程安全的数据库操作方法,有效地防止数据混乱

核心类

FMDB有三个主要的类:

  • FMDatabase

一个FMDatabase对象就代表一个单独的SQLite数据库,用来执行SQL语句

  • FMResultSet

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

  • FMDatabaseQueue

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

打开数据库

和c语言框架一样,FMDB通过指定SQLite数据库文件路径来创建FMDatabase对象,但FMDB更加容易理解,使用起来更容易,使用之前一样需要导入sqlite3.dylib。打开数据库方法如下:

NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"person.db"];
FMDatabase *database = [FMDatabase databaseWithPath:path];    
if (![database open]) {
    NSLog(@"数据库打开失败!");
}

path 的值可以传入以下三种:

  • 具体文件路径,如果不存在会自动创建
  • 空字符串@"",会在临时目录创建一个空的数据库,当FMDatabase连接关闭时,数据库文件也被删除
  • nil,会创建一个内存中临时数据库,当FMDatabase连接关闭时,数据库会被销毁

更新

在FMDB中,除查询以外的所有操作,都称为“更新”, 如:createdropinsertupdatedelete等操作,使用executeUpdate:方法执行更新:

//常用方法有以下3种:   
- (BOOL)executeUpdate:(NSString*)sql, ...
- (BOOL)executeUpdateWithFormat:(NSString*)format, ...
- (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments
//示例
[database executeUpdate:@"CREATE TABLE IF NOT EXISTS t_person(id integer primary key autoincrement, name text, age integer)"];   
//或者  
[database executeUpdate:@"INSERT INTO t_person(name, age) VALUES(?, ?)", @"Bourne", [NSNumber numberWithInt:42]];

查询

- (FMResultSet *)executeQuery:(NSString*)sql, ...
- (FMResultSet *)executeQueryWithFormat:(NSString*)format, ...
- (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments

例:

FMResultSet *result = [database executeQuery:@"SELECT * FROM t_person"];
//2.遍历结果集
while ([result next]) {
    NSString *name = [result stringForColumn:@"name"];
    int age = [result intForColumn:@"age"];
}

CocoaPods

pod 'FMDB'
# pod 'FMDB/FTS'   # FMDB with FTS
# pod 'FMDB/standalone'   # FMDB with latest SQLite amalgamation source
# pod 'FMDB/standalone/FTS'   # FMDB with latest SQLite amalgamation source and FTS
# pod 'FMDB/SQLCipher'   # FMDB with SQLCipher

多条语句与批处理

可以将多条语句放在一起执行

NSString *sql = @"create table bulktest1 (id integer primary key autoincrement, x text);"
                 "create table bulktest2 (id integer primary key autoincrement, y text);"
                 "create table bulktest3 (id integer primary key autoincrement, z text);"
                 "insert into bulktest1 (x) values ('XXX');"
                 "insert into bulktest2 (y) values ('YYY');"
                 "insert into bulktest3 (z) values ('ZZZ');";

success = [db executeStatements:sql];

sql = @"select count(*) as count from bulktest1;"
       "select count(*) as count from bulktest2;"
       "select count(*) as count from bulktest3;";

success = [self.db executeStatements:sql withResultBlock:^int(NSDictionary *dictionary) {
    NSInteger count = [dictionary[@"count"] integerValue];
    XCTAssertEqual(count, 1, @"expected one record for dictionary %@", dictionary);
    return 0;
}];

使用FMDataBaseQueue 和线程安全

不要让多个线程分享同一个FMDatabase实例,它无法在多个线程中同时使用。 如果在多个线程中同时使用一个FMDatabase实例,会造成数据混乱等问题。所以,请使用 FMDatabaseQueue,它是线程安全的。

  • 创建队列
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:aPath];
  • 使用队列
[queue inDatabase:^(FMDatabase *db) {
    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", @1];
    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", @2];
    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", @3];

    FMResultSet *rs = [db executeQuery:@"select * from foo"];
    while ([rs next]) {
        …
    }
}];
  • 把任务包装到事务里
[queue inTransaction:^(FMDatabase *database, BOOL *rollback) {    
          [database executeUpdate:@"INSERT INTO t_person(name, age) VALUES (?, ?)", @"Bourne_1", [NSNumber numberWithInt:1]];    
          [database executeUpdate:@"INSERT INTO t_person(name, age) VALUES (?, ?)", @"Bourne_2", [NSNumber numberWithInt:2]];    
          [database executeUpdate:@"INSERT INTO t_person(name, age) VALUES (?, ?)", @"Bourne_3", [NSNumber numberWithInt:3]];      
          FMResultSet *result = [database executeQuery:@"select * from t_person"];    
             while([result next]) {   
             }   
           //回滚
           *rollback = YES;  
    }];

FMDatabaseQueue 后台会建立系列化的G-C-D队列,并执行你传给G-C-D队列的块。这意味着 你从多线程同时调用调用方法,GDC也会按它接收的块的顺序来执行。

相关文章

  • SQLite3 FMDB三方

    Github 地址: FMDB 由于 SQLite3 使用比较麻烦, 所以推荐使用第三方开源库FMDB , 他以 ...

  • swift-数据库Sqlite3

    数据库管理的第三方框架 FMDB FMDB将原生的sqlite3封装为Swift函数方法实现 可以通过 : FMD...

  • SQLite3深入浅出

    文章目录: sqlite3 基础语句 sqlite3 API sqlite3 线程安全 FMDB 基础语句: 创建...

  • FMDB 和 CoreData的区别

    一、FMDB:用OC封装C语言SQLite3 1.非苹果官方,第三方 2.还是需要程序员编写SQL语句 二、Cor...

  • iOS原生sqlite3框架操作数据库

    iOS开发的基本上都知道fmdb,自从用了fmdb之后都忘记了原生的sqlite3操作了(fmdb太好用了)。 S...

  • 数据库

    SQLite3 : FMDB我自己用 Navicat Premium - 版本v11.1.5 /'næ...

  • iOS Sqlite3 的总结

    最近在看YYCache,有许多sqlite3的语句,之前操作数据库都是用的第三方FMDB 总结一下: 常用方法 s...

  • 【iOS开发】数据存储——SQLite3框架FMDB的使用

    【iOS开发】数据存储——SQLite3框架FMDB的使用 在学习FMDB框架之前,我们首先来大概了解下SQL(S...

  • IOS Sqlite3数据库的基本使用

    这篇文章主要讲IOS 中Sqlite3数据库的简单介绍和基本的增删改插,目前已经有了FMDB等封装好的第三方,为什...

  • IOS Sqlite3数据库的基本使用

    这篇文章主要讲IOS 中Sqlite3数据库的简单介绍和基本的增删改插,目前已经有了FMDB等封装好的第三方,为什...

网友评论

    本文标题:SQLite3 FMDB三方

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