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第三方框架的更多相关文章

  1. iOS-数据持久化-第三方框架FMDB的使用

    FMDB简单介绍 一.简单说明 1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 2.FMDB的优点 使用起来更加面向对象,省去了 ...

  2. 第三方框架FMDB

    摘要:关键点:创建.插入.查询.数据格式化 第三方框架FMDB -------------------------------------------------------------------- ...

  3. [iOS]数据库第三方框架FMDB详细讲解

    [iOS]数据库第三方框架FMDB详细讲解 初识FMDB iOS中原生的SQLite API在进行数据存储的时候,需要使用C语言中的函数,操作比较麻烦.于是,就出现了一系列将SQLite API进行封 ...

  4. Swift基础之对FMDB第三方的使用方法

    相信大家都熟悉OC使用FMDB第三方库,进行数据库操作,增.删.改.查,现在我就来利用代码展示一下Swift对此库的使用方法,我是通过Pods添加的第三方库,如果手动添加记得创建桥接文件,在文件中调用 ...

  5. iOS技术面试07:第三方框架

    1ios框架分为:cocoa Touch:UIKit.Foundation.附属框架 Media:OpenGL ES.EAGL.Quartz.Core Animation.Core Audio.    ...

  6. iOS-常用的第三方框架的介绍

    写iOS 程序的时候往往需要很多第三方框架的支持,可以大大减少工作量,讲重点放在软件本身的逻辑实现上. GitHub 里面有大量优秀的第三方框架,而且 License 对商业很友好.一下摘录一下几乎每 ...

  7. android第三方框架 xlistview 的使用

    如今上拉刷新,下拉加载更多已经是浩如烟海的app的标配了 最近正好有相关的需要就去学习了一下,还是那句老话凡事都靠自己来 搞实在不是一件好事,费时费力不说可能还是在做无用功,不过自己研究学习 还是很有 ...

  8. iOS “智慧气象”APP中用到的第三方框架汇总

    “智慧气象”是我最近在公司接手的项目,已经完成最新版本的更新并上架,在此分享下其中用到的第三方框架的使用. 应用地址:APP商店搜索“智慧气象” MJRefresh(下拉刷新)业界知名下拉刷新框架就不 ...

  9. iOS 如何通过CocoaPods添加第三方框架

    一  先安装Ruby环境: http://ruby-china.org/wiki/install_ruby_guide 在安装的时候,若是出现: 1.You don't have write perm ...

随机推荐

  1. 最好的简明NodeJS学习材料

    http://www.nodebeginner.org/index-zh-cn.html http://debuggable.com/posts/understanding-node-js:4bd98 ...

  2. MongoDB碎碎念

    1. 如何从备份节点读取数据 默认是不允许的,会报如下错误: testReplSet:SECONDARY> show dbs --19T10:: E QUERY [thread1] Error: ...

  3. android 之 ListView 里面嵌套 GridView 遇到的问题及其解决方法。

    我们直接入主题.所有问题例子请参照下图 1,怎样使图片具有点击事件? 答: 解决方法: 在你的BaseAdapter里面不要设置下面这三个东西,然后再设置GridView的onItemClick. g ...

  4. 如何做优化,UITabelView才能更加顺滑 (转载)

    这篇文章是前两周@叶孤城叶大在微信群里面的分享,一直到这两天才翻出来研究.很多实用的东西,不过由于水平有限,有些地方没能翻译好,还请大家指正. 我已经在iOS这个最好的移动平台上有几年的开发经验了.在 ...

  5. Oracle段收缩功能

    1.了解段收缩 2.自动执行Segment Advisor 3.收缩段 1. 了解段收缩 应用场景:如果对一张表频繁执行插入.更新和删除操作,时间长了可能会出现大量碎片,Oracle针对这种场景推出段 ...

  6. MyEclipse打不开jsp文件 报错“Failed to create the part's controls"

    本来写好了一套网站html代码,需要移植到myeclipse的jsp页面中,当复制代码完毕后,也是可以运行的并不报错,但一直有弹框提示有空指针,当关闭页面后再次打开就歇菜了,提示 我预感到这可能是my ...

  7. Win8.1安装mysql-installer-community-5.6.21.0.mis

    引言 我本机是win8.1,在官网下载的这个安装是32位和64位都能装,安装步骤参考:http://jingyan.baidu.com/article/67662997305dcd54d51b84d4 ...

  8. js构建ui的统一异常处理方案(一)

    从早期从事基于java的服务器端开发,再到之后从事基于web和js的ui开发,总体感觉基于web页面的ui开发远不如服务器端健壮.主要是早期ie浏览器功能太弱小,很多业务被迫放到服务器端去实现,浏览器 ...

  9. VS2015 打开html 提示 未能完成操作 解决办法

    删除%LocalAppData%\Microsoft\VisualStudio\14.0\ComponentModelCache下所有文件,然后重启VS. 快捷键:Win + R,输入 %LocalA ...

  10. 3.Code-First 约定(EF Code-First系列)

    前面,我们已经了解了Code-First利用领域类,怎么为我们创建数据库的简单示例.现在我们来学习一下Code-First约定吧. 什么是约定 约定说白了,就是基于一套规矩办事,这里就是基于你定义好的 ...