FMDB第三方框架
FMDB是同AFN,SDWebImage同样好用的第三方框架,它以OC的方式封装了SQLite的C语言API,使得开发变得简单方便。
附上github链接https://github.com/ccgus/fmdb
FMDB有三个主要的类
(1)FMDatabase
一个FMDatabase对象就代表一个单独的SQLite数据库
用来执行SQL语句
(2)FMResultSet
使用FMDatabase执行查询后的结果集
(3)FMDatabaseQueue
用于在多线程中执行多个查询或更新,它是线程安全的
上demo
先导入libsqlite3.0.tbd库
将FMDB加入工程里,当然你也可以用cocopods导入FMDB
下面是创建数据库的代码
#import "ViewController.h"
#import "NSString+Tool.h"
#import "FMDB.h"
@interface ViewController ()
@property (nonatomic, strong) FMDatabase * database;
@end
@implementation ViewController
- (IBAction)selectAction:(id)sender {
if ([self.database open]) {
//返回查询数据的结果集
FMResultSet * rs = [self.database executeQuery:@"select * from t_student"];
//查询表中的每一个记录
while ([rs next]) {
NSString * name = [rs stringForColumn:@"name"];
NSUInteger age = [rs intForColumn:@"age"];
NSLog(@"name = %@, age = %@",name,@(age));
}
[self.database close];
}
}
- (IBAction)updateAction:(id)sender {
if ([self.database open]) {
BOOL flag = [self.database executeUpdate:@"update t_student set name = 'xiaohong' where name = 'dahuan'"];
if (flag) {
NSLog(@"修改成功");
}else {
NSLog(@"修改失败");
}
[self.database close];
}
}
- (IBAction)deleteAction:(id)sender {
if ([self.database open]) {
BOOL flag = [self.database executeUpdate:@"delete from t_student"];
if (flag) {
NSLog(@"删除成功");
}else {
NSLog(@"删除失败");
}
[self.database close];
}
}
- (IBAction)insertAction:(id)sender {
if ([self.database open]) {
BOOL flag = [self.database executeUpdate:@"insert into t_student (name,age) values (?,?)",@"dahuan",@18];
if (flag) {
NSLog(@"插入成功");
}else {
NSLog(@"插入失败");
}
[self.database close];
}
}
- (void)viewDidLoad {
[super viewDidLoad];
NSString * filename = [NSString cachaPathName:@"data.sqlite"];
NSLog(@"%@",filename);
//1、创建数据库
self.database = [[FMDatabase alloc] initWithPath:filename];
//2、打开数据库
if ([self.database open]) {
NSLog(@"打开数据库成功");
//3、创建表
BOOL flag = [self.database executeUpdate:@"create table if not exists t_student (id integer primary key autoincrement ,name text, age integer);"];
if (flag) {
NSLog(@"创建表成功");
} else {
NSLog(@"创建表失败");
}
//4、关闭数据库
[self.database close];
} else {
NSLog(@"打开数据库失败");
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
同样我们封装一下FMDB的增删改查操作
FMDBManger.h
#import <Foundation/Foundation.h> @interface FMDBManger : NSObject /** 增、删、改的操作 */
+ (BOOL)executeUpdate:(NSString*)sql; /** 查询的操作 */
+ (NSArray *)executeQuery:(NSString*)sql; @end
FMDBManger.m
#import "FMDBManger.h"
#import "NSString+Tool.h"
#import "FMDB.h" static FMDatabase *_dataBase; @implementation FMDBManger + (void)initialize
{
// 1.创建数据库
NSString *fileName = [NSString cachaPathName:@"student.sqlite"];
_dataBase = [FMDatabase databaseWithPath:fileName]; // 2.打开数据库
if ([_dataBase open]) {
NSLog(@"打开数据库成功");
// 3.创建表
BOOL flag = [_dataBase executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id integer PRIMARY KEY AUTOINCREMENT, name text, age integer);"];
if (flag) {
NSLog(@"创建表成功");
}else{
NSLog(@"创建表失败");
} // 4.关闭数据库
[_dataBase close];
}else{
NSLog(@"打开数据库失败");
}
} /** 增、删、改的操作 */
+ (BOOL)executeUpdate:(NSString*)sql
{
NSLog(@"sql:%@", sql);
// 1.打开数据库
if ([_dataBase open]) {
// 2.修改数据
BOOL flag = [_dataBase executeUpdate:sql]; // 3.关闭数据库
[_dataBase close]; return flag;
} return NO;
} /** 查询的操作 */
+ (NSArray *)executeQuery:(NSString *)sql
{
// 0.初始化数组,用于存放查询数据
NSMutableArray *dataList = [NSMutableArray array];
// 1.打开数据库
if ([_dataBase open]) {
// 2.准备查询数据
FMResultSet *resultSet = [_dataBase executeQuery:sql];
// 3.查询符合条件的数据
while ([resultSet next]) {
// 4.获得数据
// 4.1根据字段名来获取数据
NSString *name = [resultSet stringForColumn:@"name"];
NSInteger age = [resultSet intForColumn:@"age"]; // 添加数据
[dataList addObject:@{@"name": name, @"age" : @(age)}]; NSLog(@"name:%@ age:%zi", name, age);
} // 关闭数据库
[_dataBase close];
}
return dataList;
} @end
数据库有个基本概念,事务,生活中比如ATM取款要求是线程安全的,FMDB的以下很好的解决这个问题
#import "ViewController.h"
#import "NSString+Tool.h"
#import "FMDB.h" @interface ViewController () @property (nonatomic, strong) FMDatabaseQueue * queue; @end @implementation ViewController - (IBAction)insertAction:(id)sender { [self.queue inDatabase:^(FMDatabase *db) { if ([db open]) { [db executeUpdate:@"insert into t_person (name,money) values (?,?)",@"张三",@];
[db executeUpdate:@"insert into t_person (name,money) values (?,?)",@"李四",@]; [db close];
}
}];
} - (IBAction)deleteAction:(id)sender { [self.queue inDatabase:^(FMDatabase *db) { if ([db open]) { BOOL flag = [db executeUpdate:@"delete from t_person"];
if (flag) {
NSLog(@"删除成功");
} else {
NSLog(@"删除失败");
}
[db close];
} }];
} - (IBAction)updateAction:(id)sender { //事务的好处:存储大量数据 [self.queue inDatabase:^(FMDatabase *db) { if ([db open]) { //添加事务操作
[db beginTransaction]; BOOL flag1 = [db executeUpdate:@"update t_person set monaaaey = 1000 where name = '张三'"]; BOOL flag2 = [db executeUpdate:@"update t_person set money = 500 where name = '李四'"]; if (!(flag1 && flag2)) { //事务回滚
[db rollback];
} //提交事务
[db commit]; [db close];
}
}];
} - (IBAction)selectAction:(id)sender { [self.queue inDatabase:^(FMDatabase *db) { if ([db open]) { FMResultSet * rs = [db executeQuery:@"select * from t_person"]; while ([rs next]) { NSString * name = [rs stringForColumn:@"name"];
CGFloat money = [rs doubleForColumn:@"money"];
NSLog(@"name = %@ money = %lf",name,money);
} [db close];
}
}]; } - (void)viewDidLoad {
[super viewDidLoad]; NSString * filename = [NSString cachaPathName:@"person.sqlite"]; //创建FMDatabaseQueue实例,不需要再去打开数据库
self.queue = [FMDatabaseQueue databaseQueueWithPath:filename]; //在多线程安全的情况下操作数据
[self.queue inDatabase:^(FMDatabase *db) { BOOL flag = [db executeUpdate:@"create table if not exists t_person (id integer primary key autoincrement, name text,money real);"]; if (flag) {
NSLog(@"创建成功");
} else {
NSLog(@"创建失败");
} [db close];
}]; } @end
FMDB第三方框架的更多相关文章
- iOS-数据持久化-第三方框架FMDB的使用
FMDB简单介绍 一.简单说明 1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 2.FMDB的优点 使用起来更加面向对象,省去了 ...
- 第三方框架FMDB
摘要:关键点:创建.插入.查询.数据格式化 第三方框架FMDB -------------------------------------------------------------------- ...
- [iOS]数据库第三方框架FMDB详细讲解
[iOS]数据库第三方框架FMDB详细讲解 初识FMDB iOS中原生的SQLite API在进行数据存储的时候,需要使用C语言中的函数,操作比较麻烦.于是,就出现了一系列将SQLite API进行封 ...
- Swift基础之对FMDB第三方的使用方法
相信大家都熟悉OC使用FMDB第三方库,进行数据库操作,增.删.改.查,现在我就来利用代码展示一下Swift对此库的使用方法,我是通过Pods添加的第三方库,如果手动添加记得创建桥接文件,在文件中调用 ...
- iOS技术面试07:第三方框架
1ios框架分为:cocoa Touch:UIKit.Foundation.附属框架 Media:OpenGL ES.EAGL.Quartz.Core Animation.Core Audio. ...
- iOS-常用的第三方框架的介绍
写iOS 程序的时候往往需要很多第三方框架的支持,可以大大减少工作量,讲重点放在软件本身的逻辑实现上. GitHub 里面有大量优秀的第三方框架,而且 License 对商业很友好.一下摘录一下几乎每 ...
- android第三方框架 xlistview 的使用
如今上拉刷新,下拉加载更多已经是浩如烟海的app的标配了 最近正好有相关的需要就去学习了一下,还是那句老话凡事都靠自己来 搞实在不是一件好事,费时费力不说可能还是在做无用功,不过自己研究学习 还是很有 ...
- iOS “智慧气象”APP中用到的第三方框架汇总
“智慧气象”是我最近在公司接手的项目,已经完成最新版本的更新并上架,在此分享下其中用到的第三方框架的使用. 应用地址:APP商店搜索“智慧气象” MJRefresh(下拉刷新)业界知名下拉刷新框架就不 ...
- iOS 如何通过CocoaPods添加第三方框架
一 先安装Ruby环境: http://ruby-china.org/wiki/install_ruby_guide 在安装的时候,若是出现: 1.You don't have write perm ...
随机推荐
- 【资源】108个大数据文档PDF开放下载-整理后打包下载
本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html 本博客其他.NET开源项目文章目录:h ...
- IOS数据存储之归档/解档
前言: 前天学习了NSUserDefaults,我们知道NSUserDefaults不能保存自定义对象,所以我们今天来认识一下归档(NSKeyedArchiver)和解档(NSKeyedUnarchi ...
- 前端工程优化:javascript的优化小结
我觉得优化javascript是一门高深的学问,在这里也只能站在前人的肩膀上,说一些我浅显的认识,更希望的是抛钻引玉,如有不对,敬请斧正. 首先,要认识到是,优化js的关键之处在于,优化它的运行速度 ...
- 我的iOS开发系列博文
之前目录性的总结了发表过的关于OC方面的文章,今天在目录性的总结一下有关iOS开发的文章.走过路过不要错过哦,今天的博文也全都是干货.写技术博客与大家交流一下思想也是不错的. 下面是我的技术博客中有关 ...
- JSON导出CSV中文乱码解决方案
前言 以往datagrid导出数据全部在后台搞定,现在就想换中思路去解决,正常情况下使用easyui datagrid ajax获取数据源时都是json格式,那么此时需要导出数据时只要把该数据源扔出来 ...
- 分享在winform下实现左右布局多窗口界面-续篇
之前的这篇文章<分享在winform下实现左右布局多窗口界面>已经实现了左右布局多窗口界面,今天本来是研究基于winform的插件编程,没想到顺便又找到了另一种实现方案,这种实现方案更简单 ...
- 7.3 数据注解特性之ConcurrencyCheck特性【Code-First系列】
ConcurrencyCheck特性可以应用到领域类的属性中.当EF执行更新操作的时候,Code-First将列的值放在where条件语句中,你可以使用这个CurrencyCheck特性,使用已经存在 ...
- HighchartsNET快速图表控件-开源
前言: HighchartsNET快速图表控件,基于Highcharts的asp.net web控件.只需几行代码你就能快速生成一个图表. 从此不再担心图表复杂.简单几行代码就可以搞定,节省大量工作时 ...
- 一个简单的WPF字体选择器实现
很久没有写博客了. 这是放暑假中的第一篇博客,以后会多多更新!!! 这就是我写的一个字体选择器,界面如下: 本程序用到的技术比较简单,仅仅是用了Font类的几个方法和数据绑定而已. 首先建一个四行两列 ...
- C#+arcengine10.0+SP5实现鹰眼(加载的是mdb数据库中的数据)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...