数据存储之第三方FMDB
上周四、周五在忙公司的事情和炒股,没来得及更新博客,这周就补一下,学习总结下FMDB。
FMDB是对sqlite的封装,特别是在多线程情况下,使用sqlite是非常麻烦,而使用FMDB相对简单,下面是使用FMDatabase和FMDatabasequeue的代码例子
// // ViewController.m // FMDBDemo // // Created by cyw on 15-4-26. // Copyright (c) 2015年 cyw. All rights reserved. // #import "ViewController.h" #import "FMDB.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // FMDB常用三个类: // 1.FMDatabase :单一的sqlite数据库,用于执行sql语句 // 2.FMDatabaseQueue:多线程下执行sql语句 // 3.FMResultSet:sql语句的结果集 // 1.数据库文件路径 NSString *path=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSString *filePath=[path stringByAppendingPathComponent:@"cyw.sqlite"]; NSLog(@"%@",filePath); // 创建FMDB对象 // 参数有3中情况: // 1.文件路径 文件不存在自动创建 // 2.nil 会创建内存中的临时数据库,当FMDatabase关闭时,自动销毁 // 3.@"" 会在临时目录创建空数据库,关闭时销毁 // FMDatabase *db=[[FMDatabase alloc]initWithPath:filePath]; // FMDatabase *bd=[FMDatabase databaseWithPath:filePath]; //打开数据库 // if ([db open]) { // //新建数据库 // [self createTable:db]; // // //插入数据 // [self insertData:db]; // //查询数据 // [self selectData:db]; // [db close]; // } // 数据库有锁和事务,在FMDB中可以用FMDatabaseQueue来实现 // 锁主要解决多线程的问题 事务算是加了一个隐式锁 //创建数据库队列 FMDatabaseQueue *queue=[FMDatabaseQueue databaseQueueWithPath:filePath]; // [self queueSelect:queue]; // [self queueTransaction:queue]; [self queueIntranscation:queue]; } -(BOOL)createTable:(FMDatabase*)db { //此两个sql一起执行报错 //create table if not exists P_Class (CId integer primary key ,CName varchar(20)); NSString *strsql=@"create table if not exists Person(id integer primary key autoincrement ,age integer not null,name text not null,photo blob,registerTime DATETIME DEFAULT (datetime(CURRENT_TIMESTAMP,'localtime')),sex char(1) default '0',money numeric(10,2),classId integer,constraint fk_Person_class foreign key (classId) references P_Class (CId));"; // FMDatabase中更新操作都是使用executeUpdate方法 查询使用executeQuery方法 BOOL result= [db executeUpdate:strsql]; if (result) { NSLog(@"数据库创建成功"); } else { NSLog(@"数据库创建失败"); } return result; } -(void)insertData:(FMDatabase*)db { [db executeUpdate:@"delete from person"]; //executeUpdate方法的不同参数 // [db executeUpdate:@"insert into P_Class(CId,CName) values(?,?);" withArgumentsInArray:@[@1001,@"软件工程"]]; //注意加@ [db executeUpdate:@"insert into person(name,age,money,classId) values(?,?,?,?);",@"cuiyw",@24,@200.3,@1001]; [db executeUpdateWithFormat:@"insert into Person(name,age,money,classId) values(%@,%d,%f,%d)",@"cyw",23,210.9,1001]; } -(void)selectData:(FMDatabase*)db { // 查询数据 NSString *strsql=@"select id,name,age,money from Person"; // FMResultSet返回结果集 FMResultSet *set=[db executeQuery:strsql]; while ([set next]) { int pid=[set intForColumn:@"id"]; NSString *name=[set stringForColumnIndex:1]; int age=[set intForColumn:@"age"]; float money=[set doubleForColumnIndex:3]; NSLog(@"%d %@ %d %f",pid,name,age,money); } NSString *strsql1=@"select CId,CName from P_Class"; // FMResultSet返回结果集 FMResultSet *set1=[db executeQuery:strsql1]; while ([set1 next]) { NSString *name=[set1 stringForColumnIndex:1]; int age=[set1 intForColumn:@"CId"]; // float money=[set doubleForColumnIndex:2]; NSLog(@"%@ %d ",name,age); } } -(void)queueSelect:(FMDatabaseQueue*)queue { //打开数据库 [queue inDatabase:^(FMDatabase *db) { [self selectData:db]; }]; } //事务的两种写法 -(void)queueTransaction:(FMDatabaseQueue*)queue { [queue inDatabase:^(FMDatabase *db) { [self selectData:db]; [db beginTransaction]; [db executeUpdate:@"update Person set money=money+20.0 where id=4"]; [db executeUpdate:@"update Person set money=money-20.0 where id=3"]; [db commit]; [self selectData:db]; }]; } -(void)queueIntranscation:(FMDatabaseQueue*)queue { [queue inTransaction:^(FMDatabase *db, BOOL *rollback) { [self selectData:db]; [db executeUpdate:@"update Person set money=money+20.0 where id=4"]; [db executeUpdate:@"update Person set money=money-20.0 where id=3"]; [self selectData:db]; }]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
数据存储之第三方FMDB的更多相关文章
- 数据存储之第三方FMDB优化
最近项目要用到数据库,采用的是第三方FMDB, 之前做C#时用过sqlHelper,自己就按着sqlHelper的思路封装了一下,封装的也比较简单,看到网上有一些根据FMDB封装的ORM框架,但基本都 ...
- IOS 数据存储之 FMDB 详解
FMDB是用于进行数据存储的第三方的框架,它与SQLite与Core Data相比较,存在很多优势. FMDB是面向对象的,它以OC的方式封装了SQLite的C语言API,使用起来更加的方便,不需要过 ...
- IOS数据存储之FMDB数据库
前言: 最近几天一直在折腾数据库存储,之前文章(http://www.cnblogs.com/whoislcj/p/5485959.html)介绍了Sqlite 数据库,SQLite是一种小型的轻量级 ...
- 【iOS开发-76】Private Contacts案例:导航控制器使用、数据传递、第三方类库使用、tableViewCell的加入删除、数据存储等
(1)效果 (2)源码与第三方类库下载 http://download.csdn.net/detail/wsb200514/8155979 (3)总结 --导航控制器,能够直接用代码的push和pop ...
- 在AndroidStudio中数据存储第三方数据管理Bmob的使用
---恢复内容开始--- 在日常写代码的过程中我们比较痛苦的就是数据库的建立和使用,那么今天来介绍一下一个第三方的数据管理平台Bmonb. 一.我们首先进入Bmob的官网创建一个账号 Bome官网网址 ...
- IOS数据存储之Sqlite数据库
前言: 之前学习了数据存储的NSUserDefaults,归档和解档,沙盒文件存储,但是对于数据量比较大,需要频繁查询,删除,更新等操作的时候无论从效率上还是性能上,上述三种明显不能满足我们的日常开发 ...
- 【原】iOS学习47之第三方-FMDB
将 CocoaPods 安装后,按照 CocoaPods 的使用说明就可以将 FMDB 第三方集成到工程中,具体请看博客iOS学习46之第三方CocoaPods的安装和使用(通用方法) 1. FMDB ...
- ios中常见数据存储方式以及SQLite常用的语句
在iOS中,根据不同的需求对应的有多种数据存储方式: 1.NSUserdefaults 将数据存储到沙盒中(library),方便易用,但是只能存储系统提供的数据类型(plist),不能存储自定义的 ...
- iOS常用的几种数据存储方式
之前由于刚入行不久,对数据持久化不是很了解,尤其是用数据库存储大量数据的操作.经过摸索就在此总结一下,方便以后查阅 下面就简单介绍一下: 1.NSUserDefaults 感觉最常用的小量数据,属性, ...
随机推荐
- linux命令 find的应用
1.列出当前目录及子目录下所有文件和文件夹 2.在 /home目录下查找以 “.txt”结尾的文件名 3.在当前目录下查找所有以“.txt”结尾的文件 4基于目录深度搜索(向下最大深度限制为3) 5. ...
- .NET高级代码审计(第三课)Fastjson反序列化漏洞
0X00 前言 Java中的Fastjson曾经爆出了多个反序列化漏洞和Bypass版本,而在.Net领域也有一个Fastjson的库,作者官宣这是一个读写Json效率最高的的.Net 组件,使用内置 ...
- C#实现枚举的相关操作
枚举中的Descript()描述值,以及枚举值是一种一一对应的关系.我们可以获取其描述值和枚举值,存放到字典中, 在实际的使用中我们就可以轻松的根据枚举值来获取其描述值,也可以通过枚举的描述值来获取其 ...
- 动态产生select option列表
在很久之前,Insus.NET刚学习前端时,有写过<动态创建一些常的html标签>http://www.cnblogs.com/insus/p/3741665.html 但其中没有实现动态 ...
- 控制台API函数----HANDLE、SetConsoleCursorPosition、SetConsoleTextAttribute
控制台API函数 调用相关文本界面控制的API函数,这些函数可分为三类. 一.用于控制台窗口控制的函数(包括窗口的缓冲区大小.窗口前景字符和背景颜色.窗口标题.大小和位置等): 二.用于控制台输入输出 ...
- 简单线性回归问题的优化(SGD)R语言
本编博客继续分享简单的机器学习的R语言实现. 今天是关于简单的线性回归方程问题的优化问题 常用方法,我们会考虑随机梯度递降,好处是,我们不需要遍历数据集中的所有元素,这样可以大幅度的减少运算量. 具体 ...
- centoos 安装hadoop集群
环境准备 两台centoos系统服务器 H30(192.168.3.238) H31(192.168.3.237) H30为master,H31为slave,slave后续还可以再加机器: 先通过xs ...
- [JavaScript] html5 video标签注意事项
Chrome 66 禁止声音自动播放 声音无法自动播放这个在IOS/Android上面一直是个惯例,桌面版的Safari在2017年的11版本也宣布禁掉带有声音的多媒体自动播放功能,紧接着在2018年 ...
- 这两周服务器被攻击,封锁了600多个IP地址段后今天服务器安静多了
这两周服务器被攻击,封锁了600多个IP地址段后今天服务器安静多了 建议大家在自己的服务器上也封杀这些瘪三的地址 iptables -I INPUT -s 123.44.55.0/24 -j DROP ...
- Linux机器之间复制文件和目录方式&Linux的scp命令详解
本文转载于:http://www.cnblogs.com/hitwtx/archive/2011/11/16/2251254.html 整理总结如下: 不同的Linux之间copy文件常用有3种方法: ...