当前位置: 首页 > 编程日记 > 正文

SQLite第三方框架FMDB的使用,以及使用FMDatabaseQueue保证线程安全

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

(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 *s_age=@(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 *s_age=@(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];}];
}

转载于:https://my.oschina.net/fadoudou/blog/681976

相关文章:

Linus采访对Linux对git和对代码品味的理解

【Linus对办公环境的要求】 Linus大师说他11岁就开始编程,他说他是一个喜欢安静和不合群的人。 图中是他和他的弟弟,看来少儿编程还是很重要的,大师21岁写出linux0.0.1最初的内核。 图中是他的家,也是Linux的总部,非常简单的办公环境,只有显示器,大师喜欢安静,所以不想…

04 集成学习 - Boosting - AdaBoost算法构建

03 集成学习 - Boosting - AdaBoost算法原理 十、AdaBoost算法构建 上一章最后说明了每个基模型的权值α是如何求得的&#xff0c;于是我就可以对模型进行更新操作了。 构建过程一 1、假设数据集&#xff1a; T{(X1,Y1),(X2,Y2),...(Xn,Yn)} 2、初始化训练数据权重分布&#xf…

Redis源码分析 List实现

在版本3.2之前&#xff0c;Redis中的列表是 ziplist 和 linkedlist 实现的&#xff0c;在3.2之后&#xff0c;由quicklist实现。 双向链表linkedlist在表的两端进行push和pop操作非常方便&#xff0c;但是地址不连续&#xff0c;而且需要保持额外的指针。 ziplist是连续内存&am…

Linux cut命令

用途 文本文件按列提取。 特点 过于简单&#xff0c;只能处理固定格式的分隔符&#xff0c;分隔符不能使用正则表达式。 用法 命令基本格式 -b、-c、-f分别表示字节、字符、字段&#xff08;即byte、character、field&#xff09;&#xff1b;list表示-b、-c、-f操作范围&#…

【MATLAB】符号数学计算(四):符号表达式操作

一、符号表达式合并 Rcollect(S)&#xff1a;将表达式S中相同次幂的项合并。S可以是一个表达式&#xff0c;也可以是一个符号矩阵。Rcollect(S,v)&#xff1a;将表达式中S中v的相同次幂进行合并。如果v没有指定&#xff0c;则默认将含有x的相同次幂的项进行合并。 >> sy…

Alpha冲刺——day1

Alpha冲刺——day1 作业链接 Alpha冲刺随笔集 github地址 站立式会议 会议安排&#xff1a;alpha冲刺的第一天&#xff0c;我们站立式会议讨论了我们接下来的安排&#xff0c;做出大致的规划&#xff0c;并针对之前的原型设计&#xff0c;讨论了界面设计的大概 项目进展项目进展…

一步一步学习VirtualBox安装CentOS7和CentOS8

个人学习研究Linux推荐安装VirtualBoxCentOS。 CentOS7和CentOS8的安装实际上是非常相似的&#xff0c;改变的地方不多&#xff0c;从CentOS7开始和CentOS6相比改变是非常大的。 VirtualBox本身是免费的&#xff0c;足够正常学习应用了&#xff0c;安装CentOS是因为企业线上大…

建模原语:四象图

原文地址&#xff1a;http://www.douban.com/note/164191021/ “模型、状态和行为特征、场景”和“四象图”&#xff0c;建模观的命名与立象。 建模原语:四象图 作者&#xff1a;achieveideagmail.com 命名&#xff1a;模型、结构特征、行为特征、场景&#xff08;及其规约&…

【MATLAB】符号数学计算(五):符号函数的替换

一、subs替换函数 Rsubs(S)&#xff1a;用工作区中的变量值替换符号表达式中的某一特定符号。Rsubs(S,New)&#xff1a;用新符号变量New来替换符号表达式S中的默认变量。Rsubs(S,Old,New) >> syms x y >> fsym(x^2x*yy^2)f x^2 x*y y^2>> x2; >> su…

Ubuntu阿里云搭建Mono.net环境

查看磁盘信息 我们买的系统默认情况下只是安装了系统&#xff0c;而数据盘需要自己挂载&#xff0c;例如我这里的系统占用20多G&#xff0c;还有40多G的数据盘默认是没有挂载的&#xff0c;首先我们运行df -h查看&#xff1a; rootAY1212241134392134698:~# df -hFilesystem Si…

MongoDB分布式原理以及read-preference和readConcern解决读写一致性问题

MongoDB词汇表&#xff1a; https://docs.mongodb.com/manual/reference/glossary/#term-replica-set MongoDB分布式原理 primary In a replica set, the primary is the member that receives all write operations. See Primary. 在副本集中&#xff0c;主库是接收所有写…

Lua(Codea) 中 table.insert 越界错误原因分析

2019独角兽企业重金招聘Python工程师标准>>> Lua(Codea) 中 table.insert(touches, touch.id, touch) 越界错误原因分析 背景介绍 在 Codea 上运行其他人以前写的代码时, 发现某段处理 touch 事件的代码总是报错, 开始报浮点数没有整型的表示, 修改代码增加类型转换…

【MATLAB】符号数学计算(六):符号函数的操作

一、复合函数的操作 compose(f,g)&#xff1a;返回复合函数f(g(y))&#xff0c;此处ff(x)&#xff0c;gg(y)&#xff1b;compose(f,g,x,z)&#xff1a;返回自变量是z的复合函数f(g(z)) >> syms x y >> fsym(xx^-1); >> gsym(sin(x)); >> h(1y^2); >…

java中如何应对读改写场景

前言 volatile可以确保数据及时刷新到主存&#xff0c;但是对于读改写场景还是无能为力 举个例子 public class ConcurrentHashMapExample {public static void main(String[] args) throws InterruptedException {Map<String, Long> ordersMap new ConcurrentHashMap&l…

Apache Hudi的写时复制和读时合并

Apache Hudi http://hudi.apache.org/ http://hudi.apache.org/docs/quick-start-guide.html Hudi是什么 Hudi将流处理带到大数据&#xff0c;提供新数据&#xff0c;同时比传统批处理效率高一个数量级。 Hudi可以帮助你构建高效的数据湖&#xff0c;解决一些最复杂的底层…

顶尖程序员不同于常人的 5 个区别

2019独角兽企业重金招聘Python工程师标准>>> 《The Effective Engineer》的作者在写书的过程中&#xff0c;为了了解那些顶级程序员和普通程序员的区别&#xff0c;采访了很多硅谷顶级科技公司的顶尖软件工程师。他发现这些给世界带来巨大影响的的工程师们至少有以下…

【MATLAB】符号数学计算(七):符号微积分、符号微分方程求解、符号代数方程求解

一、符号表达式的极限 limit(F,x,a)&#xff1a;求当时&#xff0c;符号表达式F的极限。limit(F,a)&#xff1a;符号表达式F采用默认自变量&#xff08;可由函数findsym求得&#xff09;&#xff0c;该函数求F的自变量趋于a时的极限值。limit(F)&#xff1a;符号表达式采用默认…

Qt运行时中文乱码的解决办法

QT5的解决办法&#xff0c;在类之前添加&#xff1a;   #pragma execution_character_set("utf-8")QT4解决办法&#xff1a; QTextCodec::setCodecForLocale(QTextCodec::codecForLocale());转载于:https://www.cnblogs.com/bjxingch/articles/9992998.html

更换yum的源为阿里云或者网易

1.备份原本的yum源&#xff1a; #mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2.下载阿里云的yum源&#xff1a; CentOS6,CentOS7,CentOS8下对应的即可 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Ce…

socket编程:多路复用I/O服务端客户端之poll

一. 关于poll对于IO复用模型&#xff0c;其优点无疑是免去了对一个个IO事件就绪的等待&#xff0c;转而代之的是同时对多个IO数据的检测&#xff0c;当检测等待的事件中至少有一个就绪的时候&#xff0c;就会返回告诉用户进程“已经有数据准备好了&#xff0c;快看看是哪个赶紧…

【MATLAB】符号数学计算(八):符号分析可视化

一、funtool分析界面 在命令行窗口中输入&#xff1a; funtool 这里就说一下第四排&#xff1a; Insert&#xff1a;把当前激活窗的函数写入列表Cycle&#xff1a;依次循环显示fxlist中的函数Delete&#xff1a;从fxlist列表中删除激活窗的函数Reset&#xff1a;使计算器恢复…

java 根据实体对象生成 增删改的SQL语句 ModelToSQL

2019独角兽企业重金招聘Python工程师标准>>> java 根据实体对象生成 增删改的SQL语句 ModelToSQL 转载于:https://my.oschina.net/miaojiangmin/blog/2907010

深入浅出SpringBoot源码分析

Spring源码非常多,不要迷失在源码的汪洋大海里,抓住主要脉络,有需要再研究即可。 Bean的初始化 1.发现所有的bean ComponentScanAnnotationParser.parse()调用doScan()扫包 这里只是扫用户定义的bean,系统的自然不用扫 ClassPathBeanDefinitionScanner.doScan protected…

HBase基本知识

为什么80%的码农都做不了架构师&#xff1f;>>> 概述 HBase 特性&#xff1a; 强一致性读写: HBase 不是 "最终一致性(eventually consistent)" 数据存储. 这让它很适合高速计数聚合类任务。自动分片(Automatic sharding): HBase 表通过region分布在集群…

【编程题】猜年龄

题目标题: 猜年龄 美国数学家维纳(N.Wiener) 智力早熟&#xff0c;11岁就上了大学。他曾在1935~1936年应邀来中国清华大学讲学。 一次&#xff0c;他参加某个重要会议&#xff0c;年轻的脸孔引人注目。于是有人询问他的年龄&#xff0c;他回答说&#xff1a; “我年龄的立方是个…

XenServer和VMware vSphere技术比较

此次将Citrix XenServer7.1和VMware ESXi 6.5从技术角度进行比较&#xff0c;并从企业角度对企业关心的项进行比较。主要包含市场地位、服务器虚拟化底层稳定性、管理架构、兼容性上进行分析。 市场地位 VMware在虚拟化的地位类似于大型存储中的EMC、小型机中IBM、网络中的思科…

阿里巴巴开源的缓存框架JetCache创建缓存

官网:https://github.com/alibaba/jetcache/wiki/CacheAPI_CN ======================= 多层嵌套缓存无效的问题: https://github.com/alibaba/jetcache/issues/424 某个service的方法加缓存注解,然后引用同一个类的另一个加缓存注解service的方法,这样必须在类里面注入…

【Python】百度翻译的爬虫实现(前篇)

该程序只能实现中文到英文的翻译 import requestsimport jsonurl "http://fanyi.baidu.com/basetrans"query_str input("请输入要翻译成英文的内容&#xff1a;")data{ "query": query_str,"from": "zh","to"…

github每次推送都要输入用户名和密码

/****************************************************************************** github每次推送都要输入用户名和密码* 说明&#xff1a;* 今天开始使用github管理一些东西&#xff0c;但是每次提交都出现要输入用户名和密码&#xff0c;* 这简直让人…

ELASTIC SEARCH 性能调优

ELASTICSEARCH 性能调优建议 创建索引调优 1.在创建索引的使用使用批量的方式导入到ES。 2.使用多线程的方式导入数据库。 3.增加默认刷新时间。 默认的刷新时间是1秒钟&#xff0c;这样会产生太多小的SEGMENT&#xff0c;导致未来的合并压力&#xff0c;如果调整这个大小&…