数据存储之第三方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 感觉最常用的小量数据,属性, ...
随机推荐
- CSS 基础 例子 伪元素和伪类 & 区别
一.概念 CSS 伪类 -------向某些选择器添加特殊的效果,要达到同等效果,通过类来达到效果 CSS 伪元素 -------将特殊的效果添加到某些选择器,要达到同等效果,通过添加元素达到 ...
- Swift3 倒计时按钮扩展
extension UIButton{ func overrideSelf(){ self.setTitle("验证码", for: .normal) self.titleLabe ...
- DXP快捷键记录(红色为经常用到的)
dxp快捷键 1.设计浏览器快捷键:鼠标左击 选择鼠标位置的文档鼠标双击 编辑鼠标位置的文档鼠标右击 ...
- FormatSQL
核心提示:在一些论坛,常看到有人拼接SQL的时候,喜欢直接硬拼,结果就是出现一大堆加号和单引号,不仅写起来麻烦(你得小心该连续写多少个单引号),SQL的可读性也相当差....稍微好一点的方法是,使用Q ...
- 动态生成html元素并为元素追加属性
动态生成HTML元素的方法有三种: 第一种:document.createElement()创建元素,再用appendChild( )方法将元素添加到指定节点 <!DOCTYPE html> ...
- 自定义Chrome缩放比例
我想要设置Chrome页面缩放为120%,但是Chrome只提供110% 125%,根本没有让我舒心的缩放比例. 强迫症发作,谷歌了半天没有一个很好的解决方案. 虽然也有不少第三方扩展可以自定义缩放比 ...
- 【VB6】全局键盘钩子
基本也没啥好说的,不要用到木马及恶意程序中是以前从VB.NET程序改到VB6的,阉割了一些功能,只提供键盘Hook功能想要截获热键可以在处理函数中返回1,里面有示例 下载地址 http://pan.b ...
- EF架构获取数据时报错:The ObjectContext instance has been disposed and can no longer be used for operations that require a connection. Do you want to correct the value?
场景: EF底层,获取完主表,点击按钮,添加主表,字表内容时,报以上错误 解决方案: 在EF文件的空白处右键--属性,将“应用延迟加载”,改为False
- ASP.NET MVC的切片(Section)脚本(script)
在ASP.NET MVC使用切片脚本,实在是很溜. 在使用layout之后,只是视图套用_Layout之后,在视图中任一位置任一时候均可以使用切片脚本. 首先在_Layout.cshtml定一些规则: ...
- 02_python_while循环/格式化输出/逻辑运算
一. while循环 1.基本形式 while 条件: 循环体 # 判断条件是否为真,如果真,执行代码块.然后再次判断条件是否为真.如果真继续执行代码块...直到条件变成了假.循环退出 ps:死循环 ...