数据存储_FMDB数据库队列
一、代码示例
1.需要先导入FMDB框架和头文件,由于该框架依赖于libsqlite库,所以还应该导入该库。
2.代码如下:

1 //
2 // YYViewController.m
3 // 05-FMDB数据库队列
4 //
5 // Created by apple on 14-7-28.
6 // Copyright (c) 2014年 wendingding. All rights reserved.
7 //
8
9 #import "YYViewController.h"
10 #import "FMDB.h"
11
12 @interface YYViewController ()
13 @property(nonatomic,strong)FMDatabaseQueue *queue;
14 @end
15
16 @implementation YYViewController
17
18 - (void)viewDidLoad
19 {
20 [super viewDidLoad];
21
22 //1.获得数据库文件的路径
23 NSString *doc=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
24 NSString *fileName=[doc stringByAppendingPathComponent:@"person.sqlite"];
25
26 //2.获得数据库队列
27 FMDatabaseQueue *queue=[FMDatabaseQueue databaseQueueWithPath:fileName];
28 // FMDatabase *db=[FMDatabase databaseWithPath:fileName];
29
30 //3.打开数据库
31 [queue inDatabase:^(FMDatabase *db) {
32 BOOL result=[db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_person (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);"];
33 if (result) {
34 NSLog(@"创表成功");
35 }else
36 {
37 NSLog(@"创表失败");
38 }
39 }];
40 self.queue=queue;
41
42 }
43
44 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
45 {
46 //插入数据
47 // [self.queue inDatabase:^(FMDatabase *db) {
48 // [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @22];
49 // }];
50
51 //查询数据
52 [self.queue inDatabase:^(FMDatabase *db) {
53 // 1.执行查询语句
54 FMResultSet *resultSet = [db executeQuery:@"SELECT * FROM t_person"];
55
56 // 2.遍历结果
57 while ([resultSet next]) {
58 int ID = [resultSet intForColumn:@"id"];
59 NSString *name = [resultSet stringForColumn:@"name"];
60 int age = [resultSet intForColumn:@"age"];
61 NSLog(@"%d %@ %d", ID, name, age);
62 }
63 }];
64
65 }
66
67 @end

先插入数据,之后查询结果,打印如下:

3.代码说明



1 //插入数据
2 [self.queue inDatabase:^(FMDatabase *db) {
3 [db beginTransaction];
4 [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @22];
5 [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @23];
6 [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @24];
7 [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @25];
8 [db commit];
9 }];

如果中途出现问题,那么会自动回滚(重新开始),也可以选择手动回滚。

1 //插入数据
2 [self.queue inDatabase:^(FMDatabase *db) {
3 [db beginTransaction];
4 [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @22];
5 [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @23];
6 [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @24];
7 [db rollback];
8 [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @25];
9 [db commit];
10 }];

上面的代码。前三条插入语句是作废的。
事务处理的另一种方式:
1 [self.queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
2 [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @22];
3 [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @23];
4 [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @24];
5 }];
具体可以参考FMDB官方文档:
- FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:aPath];
- [queue inDatabase:^(FMDatabase *db) {
- [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:1]];
- [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:2]];
- [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:3]];
- FMResultSet *rs = [db executeQuery:@"select * from foo"];
- while([rs next]) {
- …
- }
- }];
- [queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
- [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:1]];
- [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:2]];
- [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:3]];
- if (whoopsSomethingWrongHappened) { //有什么错误发生的话,回滚
- *rollback = YES; return;
- }
- // etc…
- [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:4]];
- }];
whoopsSomethingWrongHappened是什么鬼?????看一下下面的demo
#pragma mark - 数据存储文件的路径
- (NSString *)dbPathTest {
NSString *string = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSString *stringPath = [string stringByAppendingPathComponent:@"test.sqlite"];
NSLog(@"%@",stringPath);
return stringPath;
}
#pragma mark - 多线程操作数据库时,事务的处理方式
- (void)threadTransaction {
//创建队列
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:[self dbPathTest]];
__block BOOL whoopsSomethingWrongHappened = true;
//把任务包装到事务里
[queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
whoopsSomethingWrongHappened &= [db executeUpdate:@"insert into myTable values(?)",[NSNumber numberWithInt:1]];
whoopsSomethingWrongHappened &= [db executeUpdate:@"insert into myTable values(?)",[NSNumber numberWithInt:2]];
whoopsSomethingWrongHappened &= [db executeUpdate:@"insert into myTabl values(?)",[NSNumber numberWithInt:3]];
//如果有错误 返回
if(!whoopsSomethingWrongHappened) {
*rollback = YES;
return;
}
NSLog(@"hello,yoowei");
}];
}
还可以看一下其他的demo中的写法:
- (void)saveChangesInBackground:(void (^)())complete {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:self.schema.storage];
[queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
@try {
for (FMDTObject *entry in self.dataArray) {
NSArray *array = [self getObjectValues:entry];
NSString *statement = nil;
if (self.relpace) {
statement = self.schema.statementReplace;
} else {
statement = self.schema.statementInsert;
}
[db executeUpdate:statement withArgumentsInArray:array];
}
}
@catch (NSException *exception) {
*rollback = YES;
}
[self.dataArray removeAllObjects];
if (complete) {
complete();
}
}];
});
}
- (void)threadNoTransaction {
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:[self dbPathTest]];
[queue inDatabase:^(FMDatabase *db) {
[db beginTransaction];
BOOL isRollBack = NO;
@try {
for (int i = 0; i<5; i++) {
NSString *roomID= [[NSString alloc] initWithFormat:@"roomid_%d",i];
NSString *sql= @"insert into myTable values(?)";
BOOL a = [db executeUpdate:sql,roomID];
if (!a) {
NSLog(@"插入失败1");
}
}
}
@catch (NSException *exception) {
isRollBack = YES;
[db rollback];
}
@finally {
if (!isRollBack) {
[db commit];
}
}
}];
}
参考链接:
http://www.cnblogs.com/wendingding/p/3873874.html
https://github.com/ccgus/fmdb
数据存储_FMDB数据库队列的更多相关文章
- Django中从本地上传excel文件并将数据存储到数据库
Django中从本地上传excel文件并将数据存储到数据库 一.前端界面 <div class="page-container"> <form action=&q ...
- Android开发--数据存储之数据库操作
简介: SQLite 的介绍: SQLite数据库属于文本型的数据库,它是以文本的形式来保存的.Android提供了对 SQLite 数据库的完全支持,应用程序中的任何类都可以通过名称来访问任何的数据 ...
- Hive 表操作(HIVE的数据存储、数据库、表、分区、分桶)
1.Hive的数据存储 Hive的数据存储基于Hadoop HDFS Hive没有专门的数据存储格式 存储结构主要包括:数据库.文件.表.试图 Hive默认可以直接加载文本文件(TextFile),还 ...
- iOS应用数据存储2-SQLite3数据库
SQLite3 SQLite3是一款开源的嵌入式关系型数据库,可移植性好,易使用,内存开销小. SQLite3是无类型的,意味着你可以保存任何类型的数据到任意表的任意字段中. SQLite ...
- Android数据存储——SQLite数据库(模板)
本篇整合Android使用数据库,要保存一个实体类的样本. 首先看一下数据库语句: ORM:关系对象映射 添加数据: ContentValues values = new ContentValues( ...
- 数据存储_FMDB
一.简单说明 1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 2.FMDB的优点 使用起来更加面向对象,省去了很多麻烦.冗余的C ...
- Python数据存储 — MySQL数据库操作
本地安装MySQL 调试环境python3.6,调试python操作mysql数据库,首先要在本地或服务器安装mysql数据库. 安装参考:https://mp.csdn.net/postedit/8 ...
- Springboot将数据存储到数据库当中
1.从前端获取数据,同时存储到use当中 public String login(HttpServletRequest request) { User user = new User(); user. ...
- Python - 数据存储与数据库简介
随机推荐
- Windows下SVN服务器的搭建步骤
1.下载svn服务端和客户端 服务端VISUALSVN SERVER:https://www.visualsvn.com/ 客户端TortoiseSVN:https://tortoisesvn.net ...
- 使用专业的消息队列产品rabbitmq之centos7环境安装
我们在项目开发的时候都不可避免的会有异步化的问题,比较好的解决方案就是使用消息队列,可供选择的队列产品也有很多,比如轻量级的redis, 当然还有重量级的专业产品rabbitmq,rabbitmq ...
- [转]ubuntu linux下DNS重启后丢失
从网上得知 /etc/resolv.conf中的DNS配置是从/etc/resolvconf/resolv.conf.d/head中加载而来,所以每回改resolv.conf都会失效,在此文件里面已经 ...
- css3
CSS3的换行 如果某个单词太长,不适合在一个区域内,它扩展到外面: 自动换行属性允许您强制文本换行 - 即使这意味着分裂它中间的一个字: 允许长文本换行: p {word-wrap:break-wo ...
- JQuery中$.ajax()方法参数详解 及 async属性说明
url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和 ...
- Linux程序包管理.md
rpm 简介 RPM包管理员(简称RPM,全称为The RPM Package Manager)是在Linux下广泛使用的软件包管理器.RPM此名词可能是指.rpm的文件格式的软件包,也可能是指其本身 ...
- eclipse调试java程序的九个技巧
转:http://www.cnblogs.com/lingiu/p/3802391.html 九个技巧: 逻辑结构 条件debug 异常断点 单步过滤 跳到帧 Inspect expressions ...
- js 页面刷新location.reload和location.replace的区别小结
reload 方法,该方法强迫浏览器刷新当前页面. 语法: location.reload([bForceGet]) 参数: bForceGet, 可选参数, 默认为 false,从客户端缓存里取当前 ...
- [LeetCode] Arithmetic Slices 算数切片
A sequence of number is called arithmetic if it consists of at least three elements and if the diffe ...
- 2016BUAA校赛决赛
A. 题意:有n个点,n-1条边,1-2-3-4-5-...-n,每条边都有权值,代表走这条边的时间,时刻0一个人在点1,问从时刻1~m,有哪些时刻这个人可能走到n点 分析:将每条边当作物品,可以选1 ...