FMDB的基本应用
FMDB简介
iOS中原生的SQLite API在进行数据存储的时候,需要使用C语言中的函数,操作比较频繁。于是,就出现了一系列将AQLite API进行封装的库,例如FMDB、PlausibleDatabase、SQLitePersistenrObjects等
FMDB是一款简洁,简易的封装库。因此在这里推荐使用第三方框架FMDB,它是对理不清lite框架的封装,用起来的步骤和SQLite使用类似,并且它对于多线程的并发操作进行了处理,所以是线程安全的
FMDB优缺点
优点:
1.对多线程的并发操作进行处理,所以是线程安全的
2.以OC的方式封装了SQLite的C语言API,使用起来更加的方便
3.FMDB是轻量级的框架,使用灵活
缺点:
1.因为它是OC的语言封装的,只能在iOS开发的时候使用,所以在实现跨平台操作的时候存在局限性
FMDB中的重要类
- FMDaraBase:一个FMDaraBase对象就代表一个单独的SQLite数据库,用来执行SQL语句
- FMRresultSet:使用FMDaraBase执行查询后的结果集
- FMDatabaseQueue:用于在多线程中执行多个查询或更新,它是线程安全的
FMDB使用步骤
1.下载FMDB文件(可以将FMDB文件夹添加到项目中,也可以使用CocoaPods导入)
2.导入libsqlite3.0框架,导入头文件FMDatabase.h
3.代码实现,与SQLite使用步骤相似,创建数据库路径,获得数据库路径,打开数据库,然后对数据库进行增删改查操作,最后关闭数据库
第一步引入框架 , 引入支持的类库
#import "ViewController.h"
// 第一步引入框架 , 引入支持的类库
#import <FMDB.h>
// libsqlite3.0.tbd @interface ViewController ()
/// 声明数据库对象
@property (nonatomic,strong) FMDatabase *dataBase;
/// 声明存储路径
@property (nonatomic,copy) NSString *filePath; @end
创建表和数据库
#pragma mark - 创建表
- (void)createTable {
// 第一步:创建sql语句
NSString *createSqlite = @"create table if not exists t_student(id integer primary key autoincrement not null, name text not null, age integer not null, sex text not null)";
// 第二步:找到文件夹路径
NSString *document = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:];
NSLog(@"document:%@",document);
// 拼接
self.filePath = [document stringByAppendingPathComponent:@"student.sqlite"];
NSLog(@"filePath:%@",self.filePath);
// 第三步:初始化FMDB
self.dataBase = [FMDatabase databaseWithPath:self.filePath];
// 第四步:数据库执行相关的操作
// 需要判断数据库打开的时候才进行执行语句
if ([self.dataBase open]) {
BOOL result = [self.dataBase executeUpdate:createSqlite];
if (result) {
NSLog(@"建表成功");
} else {
NSLog(@"建表失败");
}
}
// 第五步:关闭数据库
[self.dataBase close];
}
第一种:添加的方法
#pragma mark - 增加
- (IBAction)addAction:(id)sender {
// 第一步:打开数据库
[self.dataBase open];
// 第二步:进行相关的操作
NSArray *nameArray = [NSArray arrayWithObjects:@"mbboy", @"zhatian", @"小明", nil];
for (int i = ; i < nameArray.count; i++) {
NSString *name = [nameArray objectAtIndex:i];
// 插入语句
NSString *insertSql = @"insert into t_student(name,age,sex) values(?,?,?)";
BOOL result = [self.dataBase executeUpdate:insertSql, name, @, @"m"];
if (result) {
NSLog(@"添加成功");
} else {
NSLog(@"添加失败");
}
}
[self.dataBase close];
}
第二种:以列队的形式添加
#pragma mark - 以队列的形式添加
// 以队列的形式添加数据FMDB比较常用的添加方式
// FMDB不支持多个线程同时操作,所以一般以串行的方式实现相关操作
- (IBAction)insertManyStudent:(id)sender {
// 第一步:打开数据库
[self.dataBase open];
// 第二步:创建操作队列
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:self.filePath];
// 标识:记录是否操作成功
__block BOOL isSucceed = YES;
// 第三步:把所需要的事情打包放在队列中
[queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
// 串行队列
isSucceed = [db executeUpdate:@"insert into t_student(name,age,sex) values(?,?,?)", @"gblw", @, @"nan"] && isSucceed;
isSucceed = [db executeUpdate:@"insert into t_student(name,age,sex) values(?,?,?)", @"black", @, @"nv"] && isSucceed;
isSucceed = [db executeUpdate:@"insert into t_student(name,age,sex) values(?,?,?)", @"-1", @, @"nan"] && isSucceed;
// 如果有错误,就会将它返回
if (!isSucceed) {
// block返回的参数 rollback进行处理 (bool类型的指针)
*rollback = YES;
return ;
}
// 这句代码,假设在执行第一句执行完后,数据库服务器故障,抛出异常了,第二句就没有执行。这时候数据库的情况就是:id为1的name更新了,id为2的name没有更新。假设业务逻辑不能容忍这种只执行一半的情况,那么就应该rollback,把id为1的name恢复到一切执行之前的情况。
// 如果业务逻辑可以容忍这种只执行一半SQL的行为,那就不需要rollback。
// 数据库事务控制的精髓就一句话:对于一堆sql语句来说,要么都执行,要么都不执行。其中“要么都不执行”的部分,就是用rollback实现的
}];
[self.dataBase close];
}
注:rollback 回滚的意思。 就是数据库里做修改后( update ,insert , delete)未 commit 之前 使用 rollback 可以恢复数据到修改之前。
删除、修改
#pragma mark - 删除
- (IBAction)deleteAction:(id)sender {
// 第一步:打开数据库
[self.dataBase open];
// 第二步:执行相关操作
BOOL result = [self.dataBase executeUpdate:@"delete from t_student where name = ?", @"zhatian"];
if (result) {
NSLog(@"删除成功");
} else {
NSLog(@"删除失败");
}
[self.dataBase class];
}
#pragma mark - 修改
- (IBAction)updateAction:(id)sender {
// 第一步:打开数据库
[self.dataBase open];
// 第二步:进行相关操作
BOOL result = [self.dataBase executeUpdate:@"update t_student set name = ? where name = ?", @"孟玲旭", @"mbboy"]; if (result) {
NSLog(@"修改成功");
} else {
NSLog(@"修改失败");
}
[self.dataBase close];
}
SELECT命令就是查询,执行查询的类 FMResultSet 方法是 executeQuery
#pragma mark - 查询表中的所有数据
- (IBAction)searchAction:(id)sender {
// 第一步:打开数据库
[self.dataBase open];
// 第二步:进行相关操作
// 查询结果使用的类FMResultSet
FMResultSet *resultSet = [self.dataBase executeQuery:@"select * from t_student"];
// 遍历出需要的结果内容
while ([resultSet next]) {
NSInteger idNum = [resultSet intForColumn:@"id"];
NSString *name = [resultSet objectForColumnName:@"name"];
NSInteger age = [resultSet intForColumn:@"age"];
NSString *sex = [resultSet objectForColumnName:@"sex"];
NSLog(@"id:%ld, name:%@, age:%ld, sex:%@", idNum, name, age, sex);
}
[self.dataBase close];
} 19 - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
FMDB的基本应用的更多相关文章
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- 【原】FMDB源码阅读(二)
[原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...
- 【原】FMDB源码阅读(一)
[原]FMDB源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 说实话,之前的SDWebImage和AFNetworking这两个组件我还是使用过的,但是对于 ...
- IOS FMDB 获取数据库表和表中的数据
ios开发中,经常会用到数据库sqlite的知识,除了增,删,改,查之外,我们说说如何获取数据库中有多少表和表相关的内容. 前言 跟数据库使用相关的一般的增删改查的语句,这里就不做解释了.在网上有很多 ...
- 简单的数据库设计及使用(FMDB)
有这样一个需求: 有m个用户公用n个文件,一个用户可能会用到多个文件,一个文件可能被多个用户使用: 如果某个用户离开,那这个用户就不再使用任何文件:如果某个文件没有任何用户使用,就要删除该文件: 已知 ...
- FMDB的使用方法
转自:http://blog.devtang.com/blog/2012/04/22/use-fmdb/ 前言 SQLite (http://www.sqlite.org/docs.html) 是一个 ...
- FMDB 排它锁
-------------------------------------基本操作------------------------------------- #import "ViewCon ...
- [ios]关于用FMDB 操作数据库 删除 tableView 后刷新
刚了解使用fmdb,从数据库获取数据 绑定到一个可变数组classNameItems //从ClassList表取得数据 FMResultSet *classInfo=[db executeQuery ...
- IOS数据存储之FMDB数据库
前言: 最近几天一直在折腾数据库存储,之前文章(http://www.cnblogs.com/whoislcj/p/5485959.html)介绍了Sqlite 数据库,SQLite是一种小型的轻量级 ...
- FMDB第三方框架
FMDB是同AFN,SDWebImage同样好用的第三方框架,它以OC的方式封装了SQLite的C语言API,使得开发变得简单方便. 附上github链接https://github.com/ccgu ...
随机推荐
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (一)
作为一个完成的应用程序,数据存储操作是必不可少的.因此,Android系统一共提供了四种数据存储方式.分别是:SharePreference.SQLite.Content Provider和File. ...
- 【Web】十步教你搭建完整免费的个人网站(花生壳+XAMPP+WordPress)
1.从花生壳官网(http://www.oray.com/peanuthull/download.php)下载最新版本的客户端. 下载完成后安装,注册护照(需手机验证码验证),注册完成后获取免费域名并 ...
- 在数组中找几个数的和等于某个数[LeetCode]
首先明确一点,这个方面的问题设计到的知识点是数组的查找的问题.对于类似的这样的查找操作的具体办法就是三种解决方法: 1.暴力算法,多个for循环,很高的时间复杂度 2.先排序,然后左右夹逼,但是这样会 ...
- js基础 1.简单js 语法 关键字 保留字 变量
简单js JavaScript 是一个松散性的语言 对象属性却不想c中的结构体或者c++ 和java的对象, 对象继承机制 使用原型的prototype(原型链),js的分为三部分ECMAScript ...
- Volley 设置 RetryPolicy 不起作用, 重复提交
RT, Google后有的说是 将超时时间设置为0, 但是还是会重试提交, 解决方案如下: static HurlStack stack = new HurlStack(){ @Override pr ...
- bzoj 1040: [ZJOI2008]骑士 树形dp
题目链接 1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3054 Solved: 1162[Submit][S ...
- python的filter()函数
filter()函数是 Python 内置的另一个有用的高阶函数. filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,fil ...
- Qt的目录依赖问题----怎样生成一个绿色的Qt软件包
Qt的目录依赖问题----怎样生成一个绿色的Qt软件包 一.核心问题: 如果将编译好的Qt文件拷贝到任何目录下,作为一个绿色软件库来使用? 二.原理讨论 由于Qt在编译的时候将安装路径硬编码到了库文件 ...
- Flex控件初始化问题
有个对话框mx:TitleWindow->mx:TabNavigator->里有两个mx:Tile,每个Tile里都有个datagrid.测试如下:1.对话框显示后,马上动态监测第二个ti ...
- nodejs学习笔记_nodejs和PHP在基础架构上的差别--共享状态的并发
绝大多数对于Node.js的讨论都把关注点放在了处理高并发能力上,做开发的时候一定要明确node内部做出的权衡,以及node应用性能好的原因. node 为javascript引入了一个复杂的概念,: ...
