【iOS开发-105】SQLite第三方框架FMDB的使用,以及使用FMDatabaseQueue保证线程安全

(1)下载地址:https://github.com/ccgus/fmdb

(2)注意点

——语句可以带分号“;”,也可以省略分号。

——同样需要添加“libsqlite3.dylib”库才能使用。

——移动端的开发中,一般不关闭数据库,即不怎么使用[self.db close];,因为每次重新打开比较耗性能,且每次程序关闭时数据库自然会同时关闭。

(3)用法

#import "ViewController.h"
#import "FMDB.h"

@interface ViewController ()
@property(nonatomic,strong) FMDatabase *db;
- (IBAction)insert:(id)sender;
- (IBAction)delete:(id)sender;
- (IBAction)update:(id)sender;
- (IBAction)select:(id)sender;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    NSString *filePath=[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"fmdb.sqlite"];
    //创建数据库
    self.db=[FMDatabase databaseWithPath:filePath];
    //打开数据库
    if ([self.db open]) {
        NSLog(@"打开数据库成功");
        //创建表格,除了select外,所有的操作都是更新
        BOOL createTableResult=[self.db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id integer PRIMARY KEY AUTOINCREMENT,name text,age integer)"];
        if (createTableResult) {
            NSLog(@"创建表成功");
        }else{
            NSLog(@"创建表失败");
        }
    }else{
        NSLog(@"打开数据库失败");
    }
}

- (IBAction)insert:(id)sender {
    for (int index=0; index<50; index++) {
        NSString *s_name=[NSString stringWithFormat:@"Andy%d",arc4random()%100];
        NSNumber *[email protected](arc4random()%100);
        [self.db executeUpdate:@"INSERT INTO t_student(name,age) VALUES(?,?)",s_name,s_age];
    }
}

- (IBAction)delete:(id)sender {
    [self.db executeUpdate:@"DELETE FROM t_student WHERE id=?",@1];
}

- (IBAction)update:(id)sender {
    [self.db executeUpdate:@"UPDATE t_student SET name='Jack' WHERE id=?",@2];
}

- (IBAction)select:(id)sender {
    //获取结果集,返回参数就是查询结果
    FMResultSet *rs=[self.db executeQuery:@"SELECT * FROM t_student WHERE age>?",@50];
    while ([rs next]) {
        int ID=[rs intForColumn:@"id"];
        NSString *NAME=[rs stringForColumn:@"name"];
        int AGE=[rs intForColumn:@"age"];
        NSLog(@"%d %@ %d",ID,NAME,AGE);
    }
}
@end

(4)使用FMDatabaseQueue保证线程安全(建议以后都这么做)

——主要就是在创建数据库的时候,默认已经打开数据库

——随后的很多操作,因为需要在数据库中操作,所以需要利用队列的inDataBase方法调出数据库,在block中执行操作代码。

#import "ViewController.h"
#import "FMDB.h"

@interface ViewController ()
@property(nonatomic,strong) FMDatabaseQueue *queue;
- (IBAction)insert:(id)sender;
- (IBAction)delete:(id)sender;
- (IBAction)update:(id)sender;
- (IBAction)select:(id)sender;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    NSString *filePath=[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"fmdb.sqlite"];
    //创建数据库,并加入到队列中,此时已经默认打开了数据库,无须手动打开,只需要从队列中去除数据库即可
    self.queue=[FMDatabaseQueue databaseQueueWithPath:filePath];
    //取出数据库,这里的db就是数据库,在数据库中创建表
    [self.queue inDatabase:^(FMDatabase *db) {
        //创建表
        BOOL createTableResult=[db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id integer PRIMARY KEY AUTOINCREMENT,name text,age integer)"];
        if (createTableResult) {
            NSLog(@"创建表成功");
        }else{
            NSLog(@"创建表失败");
        }
    }];
}

- (IBAction)insert:(id)sender {
    [self.queue inDatabase:^(FMDatabase *db) {
        for (int index=0; index<50; index++) {
            NSString *s_name=[NSString stringWithFormat:@"Andy%d",arc4random()%100];
            NSNumber *[email protected](arc4random()%100);
            [db executeUpdate:@"INSERT INTO t_student(name,age) VALUES(?,?)",s_name,s_age];
        }
    }];
}

- (IBAction)delete:(id)sender {
    [self.queue inDatabase:^(FMDatabase *db) {
        [db executeUpdate:@"DELETE FROM t_student WHERE id=?",@1];
    }];
}

- (IBAction)update:(id)sender {
    [self.queue inDatabase:^(FMDatabase *db) {
        [db executeUpdate:@"UPDATE t_student SET name='Jack' WHERE id=?",@2];
    }];
}

- (IBAction)select:(id)sender {
    [self.queue inDatabase:^(FMDatabase *db) {
        //获取结果集,返回参数就是查询结果
        FMResultSet *rs=[db executeQuery:@"SELECT * FROM t_student WHERE age>?",@50];
        while ([rs next]) {
            int ID=[rs intForColumn:@"id"];
            NSString *NAME=[rs stringForColumn:@"name"];
            int AGE=[rs intForColumn:@"age"];
            NSLog(@"%d %@ %d",ID,NAME,AGE);
        }
    }];
}

(5)如果要保证多个操作同时成功或者同时失败,用事务,即把多个操作放在同一个事务中。

——FMDB中,拿到数据库直接操作事务,如下:

- (IBAction)update:(id)sender {
    [self.queue inDatabase:^(FMDatabase *db) {
        [db beginTransaction];
        [db executeUpdate:@"UPDATE t_student SET name='Jack' WHERE id=?",@2];
        [db executeUpdate:@"UPDATE t_student SET name='Tomy' WHERE id=?",@3];
        //发现情况不对时,主动回滚用下面语句。否则是根据commit结果,如成功就成功,如不成功才回滚
        [db rollback];
        [db executeUpdate:@"UPDATE t_student SET name='Eric' WHERE id=?",@4];
        [db commit];
    }];
}

上面因为用的是FMDB封装好的,其实原生的代码是这样的:

[db executeUpdate:@"BEGIN TRANSACTION"];
[db executeUpdate:@"ROLLBACK TRANSACTION"];
[db executeUpdate:@"COMMIT TRANSACTION"];

——FMDB中,也可以直接利用队列进行事务操作,队列中的打开、关闭、回滚事务等都已经被封装好了。

- (IBAction)update:(id)sender {
    [self.queue inDatabase:^(FMDatabase *db) {
        [self.queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
            [db executeUpdate:@"UPDATE t_student SET name='Jack' WHERE id=?",@2];
            [db executeUpdate:@"UPDATE t_student SET name='Tomy' WHERE id=?",@3];
            //发现情况不对时,主动回滚用下面语句。
            *rollback=YES;
            [db executeUpdate:@"UPDATE t_student SET name='Eric' WHERE id=?",@4];
        }];
}
时间: 2024-08-11 10:37:25

【iOS开发-105】SQLite第三方框架FMDB的使用,以及使用FMDatabaseQueue保证线程安全的相关文章

iOS开发之常用第三方框架(下载地址,使用方法,总结)

iOS开发之常用第三方框架(下载地址,使用方法,总结) 说句实话,自学了这么久iOS,如果说我不知道的但是又基本上都摸遍了iOS相关知识,但是每次做项目的时候,遇到难一点的地方或者没试过的东西就闷了. 比如这次,打算做一个着手做一个iOS的项目,是一个关于日计划的小软件,界面都其他的都算满意,网络就不说了,没有服务器,所以很多数据相关的功能不无法实现. 但是嘴头疼的事情就是,比如遇到一个功能的时候,其实如果说要实现的话还是可以的,但是每次在我实现之后我总会想到,这么实现更好,这么实现更简单,更加

提高iOS开发效率的第三方框架等--不断更新中。。。

1. Mantle Mantle 让我们能简化 Cocoa 和 Cocoa Touch 应用的 model 层.简单点说,程序中经常要进行网络请求,请求到得一般是 json 字符串,我们一般会建一个 Model 类来存放这些数据.这就要求我们编写一系列的序列化代码,来把 json 转换为 Model .这很费时间,容易错,不容易修改. Mantle 很好的解决了这个问题,而且更易用. GitHub : https://github.com/Mantle/Mantle 参考: 工具篇: Mantl

SQLite数据库框架--FMDB简单介绍

1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 2.FMDB的优点 使用起来更加面向对象,省去了很多麻烦.冗余的C语言代码 对比苹果自带的Core Data框架,更加轻量级和灵活 提供了多线程安全的数据库操作方法,有效地防止数据混乱 3.FMDB的github地址 https://github.com/ccgus/fmdb 二.核心类 FMDB有三个主要的类 (1)FMDatabase 一个FMDatabase对象就代表一个

iOS-数据持久化-第三方框架FMDB的使用

FMDB简单介绍 一.简单说明 1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 2.FMDB的优点 使用起来更加面向对象,省去了很多麻烦.冗余的C语言代码 对比苹果自带的Core Data框架,更加轻量级和灵活 提供了多线程安全的数据库操作方法,有效地防止数据混乱 3.FMDB的github地址 https://github.com/ccgus/fmdb 二.核心类 FMDB有三个主要的类 (1)FMDatabase 一个F

[iOS]数据库第三方框架FMDB详细讲解

[iOS]数据库第三方框架FMDB详细讲解 初识FMDB iOS中原生的SQLite API在进行数据存储的时候,需要使用C语言中的函数,操作比较麻烦.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.PlausibleDatabase.sqlitepersistentobjects等. FMDB是一款简洁.易用的封装库.因此,在这里推荐使用第三方框架FMDB,它是对libsqlite3框架的封装,用起来的步骤与SQLite使用类似,并且它对于多线程的并发操作进行了处理,所以

IOS一些高效的第三方框架库

MBProgressHUD ——进展指示符库 苹果的应用程序一般都会用一种优雅的,半透明的进度显示效果,不过这个API是不公开的,因此你要是用了,很可能被清除出AppStore.而 MBProgressHUD提供了一个替代方案,而且在用户角度上,实现的效果根本看不出和官方程序有什么差别.同时还提供了其他附加功能,比如虚拟进展 指示符,以及完成提示信息.整合到项目里也很容易,这里不细谈了. ASIHttpRequest ——HTTP Network库 iPhone当然也有自己的HTTP Netwo

sqlite第三方类库fmdb的使用

FMDB是ios平台下解析sqlite的第三方数据库管理框架,使用非常方便,而且提供了多线程安全的数据库操作,相比coredata来说更加灵活和轻量级. fmdb主要有三个类别: fmdatabase:用来执行sql语句: fmresultset:用来使用fmdatabase执行查询后的结果集合 fmdatabasequeue:用来在多线程中查询和更新数据,它是线程安全的. fmdb的使用 1.在新建的项目中,导入libsqlite3的动态数据库: 注:(在Building Phases中的Li

Android &amp;Swift iOS开发:语言与框架对比

转载自:http://www.infoq.com/cn/articles/from-android-to-swift-ios?utm_campaign=rightbar_v2&utm_source=infoq&utm_medium=articles_link&utm_content=link_text 从Android到Swift iOS开发:语言与框架对比 我从2009年开始做Android开发,开始接触Swift是在2014年底,当时组里曾经做过一个Demo App,感觉技术还

iOS开发中常用第三方库的使用和配置-GDataXML

这篇文章旨在给自己以后需要时能及时的查到,省得每次都去baidu. 1. xml解析库-GDataXML 参考文章:http://blog.csdn.net/tangren03/article/details/7868246 GDataXML下载地址: (1)GDataXML.h/m文件 http://code.google.com/p/gdata-objectivec-client/source/browse/trunk/Source/XMLSupport/ (2)DGataDefines.h