文档章节

开发数据库篇—FMDB数据库队列

z
 zwl1989
发布于 2016/04/28 13:56
字数 797
阅读 3
收藏 0

开发数据库篇—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.代码说明

有了一个队列对象,它的内部自动就拥有一个数据库对象,且数据库的操作是线程安全的。
 
二、事务
事务,没有事务的话会出现问题。
举例:银行的例子
 
张三和李四账户都有1000块钱,如果张三要转账给李四,需要执行两条SQL语句,考虑到安全性,要求这两条鱼具要么全部执行成功,要不全部执行失败。
事务:把多条语句放到同一个事务中,要么全部成功,要不全部失败(如果中途出现问题,那么会自动回滚)。事务的执行具有原子性。
  事务代码处理:
  把多条语句添加到一个事务中去执行:
复制代码
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     }];

说明:先开事务,再开始事务,之后执行block中的代码段,最后提交事务。

本文转载自:http://blog.csdn.net/zwl492454828/article/details/50342989

z
粉丝 1
博文 53
码字总数 0
作品 0
西安
私信 提问
SQLite第三方框架FMDB的使用,以及使用FMDatabaseQueue保证线程安全

(1)下载地址:https://github.com/ccgus/fmdb (2)注意点 ——语句可以带分号“;”,也可以省略分号。 ——同样需要添加“libsqlite3.dylib”库才能使用。 ——移动端的开发中,一般不关...

法斗斗
2016/05/26
142
0
iOS开发数据库篇—FMDB简单介绍

iOS开发数据库篇—FMDB简单介绍 一、简单说明 1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 2.FMDB的优点 使用起来更加面向对象,省去了很多麻烦、冗...

托楚齐坎基基
2015/12/30
202
0
iOS开发之FMDB入门学习心得(Swift版)

iOS开发之FMDB入门学习心得(Swift版) 一些废话 最近学习了一下iOS的第三方封装的sqlite数据库fmdb,于是把学习的心得进行了整理。内容只是涉及一些简单的操作:增,删,改,查。 与其说是一...

法斗斗
2016/08/10
152
0
IOS对象操作数据库--YUDBFramework

YUDBFramework 是功能强大、操作简单、轻量级、对象一键操作数据库。 感谢 FMDB DBOBject 使用 runtime + fmdb 封装 1.自动建表 2.自动检查增删表字段 3.自定义数据库名,文件路径 4.支持一对...

BruceYu的博客
2015/08/24
275
0
iOS - 数据库 第三方框架FMDB

初识FMDB iOS中原生的 API在进行数据存储的时候,需要使用C语言中的函数,操作比较麻烦。于是,就出现了一系列将SQLite API进行封装的库,例如、、等。 FMDB是一款简洁、易用的封装库。因此,...

linweida
2016/09/20
8
0

没有更多内容

加载失败,请刷新页面

加载更多

《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
今天
5
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
今天
6
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
今天
4
0
OSChina 周日乱弹 —— 我,小小编辑,食人族酋长

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享娃娃的单曲《飘洋过海来看你》: #今日歌曲推荐# 《飘洋过海来看你》- 娃娃 手机党少年们想听歌,请使劲儿戳(这里) @宇辰OSC...

小小编辑
今天
999
11
MongoDB系列-- SpringBoot 中对 MongoDB 的 基本操作

SpringBoot 中对 MongoDB 的 基本操作 Database 库的创建 首先 在MongoDB 操作客户端 Robo 3T 中 创建数据库: 增加用户User: 创建 Collections 集合(类似mysql 中的 表): 后面我们大部分都...

TcWong
今天
40
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部