码迷,mamicode.com
首页 > 数据库 > 详细

FMDB的基本使用

时间:2015-03-06 09:48:54      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:fmdb基本使用   ios的sqlite操作   ios开发数据库操作   ios存储数据   

一、什么是FMDB
FMDB是iOS平台的SQLite数据库框架
FMDB以OC的方式封装了SQLite的C语言API
依赖libsqlite3.dylib

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

FMDB的github地址
https://github.com/ccgus/fmdb

三、FMDB有三个主要的类
FMDatabase
一个FMDatabase对象就代表一个单独的SQLite数据库
用来执行SQL语句

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

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


四、FMDB创建数据库增删改查
1.通过指定SQLite数据库文件路径来创建FMDatabase对象
FMDatabase *db = [FMDatabase databaseWithPath:path];

if (![db open]) {

    NSLog(@"数据库打开失败!");
    
}n

文件路径有三种情况
具体文件路径
如果不存在会自动创建

空字符串@""
会在临时目录创建一个空的数据库
当FMDatabase连接关闭时,数据库文件也被删除

nil
会创建一个内存中临时数据库,当FMDatabase连接关闭时,数据库会被销毁

2.在FMDB中,除查询以外的所有操作,都称为“更新”
create、drop、insert、update、delete等

使用executeUpdate:方法执行更新
- (BOOL)executeUpdate:(NSString*)sql, ...
- (BOOL)executeUpdateWithFormat:(NSString*)format, ...
- (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray*)arguments

示例
//存储的只能是OC对象,例如20要包装成@20
[db executeUpdate:@"UPDATE t_studentSET age = ? WHERE name = ?;", @20, @"Jack”]
[db executeUpdateWithFormat:@"INSERT INTO t_student (name, age) VALUES (%@, %d);", name, arc4random_uniform(40)];
[db executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?, ?);" withArgumentsInArray:@[name, @(arc4random_uniform(40))]];
 
 3.查询方法
 - (FMResultSet *)executeQuery:(NSString*)sql, ...
 - (FMResultSet *)executeQueryWithFormat:(NSString*)format, ...
 - (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray*)arguments
 
 示例
 // 查询数据
 FMResultSet *rs = [db executeQuery:@"SELECT * FROM t_student"];
 
 // 遍历结果集
 while ([rs next]) {
     
     NSString*name = [rs stringForColumn:@"name"];
     
     int age = [rs intForColumn:@"age"];
     
     doublescore = [rs doubleForColumn:@"score”];
}
                    
五、FMDatabase这个类是线程不安全的,如果在多个线程中同时使用一个FMDatabase实例,会造成数据混乱等问题
                    
为了保证线程安全,FMDB提供方便快捷的FMDatabaseQueue类
                    
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]) {
        
             // …
        
         }
}];
    
                    
七、事务
使用事可以保证block中多个操作全部成功,当一个失败时回滚
[self.queue inDatabase:^(FMDatabase *db) {
    [db beginTransaction];
                    
    [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);", @"jake", @30];
    [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);", @"jake", @30];
    [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);", @"jake", @30];
    
    if (...) {
        
    [db rollback];//执行完这条语句主动回滚
        
    }
    
    [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);", @"jake", @30];
                    
    [db commit];
}];

                    
[queue inTransaction:^(FMDatabase *db, BOOL*rollback) {
         
    [db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jack"];
         
    [db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Rose"];
    
    if (...) {
        
        *rollback = YES;//执行完这条语句主动回滚
        
    }

    [db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jim"];
         
    FMResultSet *rs = [db executeQuery:@"select * from t_student"];
         
    while ([rs next]) {
             
             // …
    }
         
}];

FMDB的基本使用

标签:fmdb基本使用   ios的sqlite操作   ios开发数据库操作   ios存储数据   

原文地址:http://blog.csdn.net/u014656271/article/details/44089745

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!