博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS开发数据库篇—FMDB数据库队列
阅读量:7282 次
发布时间:2019-06-30

本文共 3879 字,大约阅读时间需要 12 分钟。

一、代码示例

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 @end15 16 @implementation YYViewController17 18 - (void)viewDidLoad19 {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         }else36         {37             NSLog(@"创表失败");38         }39     }];40     self.queue=queue;41     42 }43 44 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event45 {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中的代码段,最后提交事务。

转载于:https://www.cnblogs.com/LifeTechnologySupporter/p/10353133.html

你可能感兴趣的文章
python如何识别字符串有多少个中文字符
查看>>
MyEclipse10安装checkStyle与findBugs插件及基本使用
查看>>
MAC 安装更新 ANT
查看>>
微软新ML框架 interpret-尝试
查看>>
创建可序列化的自定义数据结构
查看>>
ios SDWebImage
查看>>
innobackupex部分备份
查看>>
mongodb查询速度慢是什么原因?
查看>>
shell top解析
查看>>
Spring RestTemplate 详解
查看>>
HTML5编程之旅 第5站Web Workers
查看>>
oracle 性能优化 02_OWI及性能视图
查看>>
<转>MySQL5.5数据库复制搭建报错之Could not initialize maste...
查看>>
职场老人谈:Linux学习分享
查看>>
针对Activity的启动模式理解1---standard模式
查看>>
用docker部署nginx+php环境时,访问php文件不执行
查看>>
第四次工业革命:自主经济的崛起
查看>>
exp/imp(导出/导入)
查看>>
Exception starting filter struts2 java.lang.ClassNotFoundException: org.apache.
查看>>
阿里与菜鸟:“计划”思维能否指挥“市场”物流
查看>>