IOS操作数据库,SQLite3和coredata是两个非常好的选择,但是对于我们这些掌握了其他数据库语言的人来说,使用这两中操作都 会觉得不方便,SQLite3使用起来太复杂了,而使用coredata的时候却封装太死了,我们需要自己些自己的数据库语句,这时候,FMDB就是一个 非常不错的选择!
什么是FMDB 
FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API
FMDB的优点 
使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码 对比苹果自带的Core Data框架,更加轻量级和灵活 提供了多线程安全的数据库操作方法,有效地防止数据混乱
FMDB有三个主要的类 
①FMDatabase一个FMDatabase对象就代表一个单独的SQLite数据库 用来执行SQL语句
②FMResultSet使用FMDatabase执行查询后的结果集
③FMDatabaseQueue用于在多线程中执行多个查询或更新,它是线程安全的
————————————————————————
具体使用
1、导入头文件
#import "FMDatabase.h"

2、定义成员变量
FMDatabase* _db;

3、创建数据库.db文件
NSString* path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/data.db"];

4、用path路径初始化FMDatabase
_db = [[FMDatabase alloc] initWithPath:path];

5、打开数据库[_db open]
//打开数据库
    BOOL res = [_db open];
    if (res == NO) {
        NSLog(@"打开失败");
        return;
    }

6、创建表
res = [_db executeUpdate:@"create table if not exists USER(id integer primary key autoincrement,name,score,p_w_picpath)"];
    if (res == NO) {
        NSLog(@"创建表失败");
    }

7、关闭数据库
[_db close];

8、增加操作
//FMDB支持类型  NSString NSNumber NSData
将数据转化为能够存储进数据库的类型
NSData* p_w_picpathData = UIImagePNGRepresentation(_p_w_picpathView.p_w_picpath);
    NSString* name = _nameField.text;
    NSNumber* score = [NSNumber numberWithInt:[_scoreField.text intValue]];
    //打开数据库
    BOOL res = [_db open];
    if (res == NO) {
        NSLog(@"打开失败");
    }

//插入数据
    res = [_db executeUpdate:@"insert into USER(name,score,p_w_picpath) values(?,?,?)", name, score, p_w_picpathData];
    if (res == NO) {
        NSLog(@"插入数据失败");
    }
    [_db close];

9、删除操作
//删
- (void)del:(id)sender{
    BOOL res = [_db open];
    if (res == NO) {
        NSLog(@"打开失败");
        return;
    }
    res = [_db executeUpdate:@"delete from USER where name=?", _nameField.text];
    if (res == NO) {
        NSLog(@"删除失败");
    }
    [_db close];
}

10、查询操作
//查
- (void)fetch:(id)sender{
    BOOL res = [_db open];
    if (res == NO) {
        NSLog(@"打开失败");
        return;
    }
    FMResultSet* set = [_db executeQuery:@"select * from USER"];
    while ([set next]) {
        //取值
        NSString* name = [set stringForColumn:@"name"];
        int score = [set intForColumn:@"score"];
        NSData* data = [set dataForColumn:@"p_w_picpath"];
        NSLog(@"%@ --- %d", name, score);
        //[set objectForColumnName:@"score"];
    }
    [_db close];
}

——————————————————————————————————————
多线程管理FMDB:
FMDatabase这个类是线程不安全的,如果在多个线程中同时使用一个FMDatabase实例,会造成数据混乱等问题
为了保证线程安全,FMDB提供方便快捷的FMDatabaseQueue类
使用FMDatabaseQueue很简单,首先用一个数据库文件地址来初使化FMDatabaseQueue,然后就可以将一个闭包(block)传入inDatabase方法中。在闭包中操作数据库,而不直接参与FMDatabase的管理。

FMDatabaseQueue的创建 
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:path];
简单使用 [queue inDatabase:^(FMDatabase *db) {
    [db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jack"];
    [db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Rose"];
    [db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jim"];
    FMResultSet *rs = [db executeQuery:@"select * from t_student"];
    while ([rs next]) {
            // …
    }
}];