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. Util应用程序框架公共操作类(一):数据类型转换公共操作类(介绍篇)

    本系列文章将介绍一些对初学者有帮助的辅助类,这些辅助类本身并没有什么稀奇之处,如何能发现需要封装它们可能更加重要,所谓授之以鱼不如授之以渔,掌握封装公共操作类的技巧才是关键,我会详细说明创建这些类的动 ...

  2. 我的iOS开发系列博文

    之前目录性的总结了发表过的关于OC方面的文章,今天在目录性的总结一下有关iOS开发的文章.走过路过不要错过哦,今天的博文也全都是干货.写技术博客与大家交流一下思想也是不错的. 下面是我的技术博客中有关 ...

  3. 高级javascript---模块化编程

    随着网站逐渐变成“互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂 网页越来越像桌面程序,需要一个团队分工协作.进度管理.单元测试等等......开发者不得不使用软 ...

  4. 使用免费组件view pdf 文档

    “Is there any way to view PDF files in a Winforms tool?” 这个是我在技术论坛上发现的一个老外求助的帖子,然后看到别人回复的帖子中建议了一个免费的 ...

  5. C/C++ char a[ ] 和 char *a 的差别,改变 char *a爆内存错误的原因

    对于一些需要传入参数为 char * temp 指针类的函数: 我们定义一个 char a[10] 或char *a 传进去都是可以的. 但是, 如果该函数是会改变你所传入的参数的值时, 传入 cha ...

  6. 恢复SharePoint Server 2013 中的“新颖快建视图”

    初始化后就很漂亮的"新颖快建视图" 在配置好了OWA(Office Web Apps)的环境下,可以使用独特的"新颖快建视图"新建文件与文件夹,如下图所示: F ...

  7. Oracle Recovery 01 - 常规恢复之完全恢复

    背景:这里提到的常规恢复指的是数据库有完备可用的RMAN物理备份. 实验环境:RHEL6.4 + Oracle 11.2.0.4 DG primary. 一.常规恢复之完全恢复:不丢失数据 1.1 单 ...

  8. hibernate笔记--缓存机制之 一级缓存(session缓存)

    一级缓存: 又称为session缓存,它和session生命周期相同,周期非常短.是事务级别的缓存: 还是以Book和Category这两个表为例,我们用代码观察一个缓存的存在: 假设现在我要去查询i ...

  9. 12款响应式 Lightbox(灯箱)效果插件

    灯箱效果(Lightbox)是网站中最常用的效果之一,用于实现类似模态对话框的效果.网络上各种 Lightbox 插件琳琅满目,随着响应式设计(Respnsive Design)的发展,这一先进理念也 ...

  10. Github团队开发示例(一)

    Github团队开发示例(二) 作者:Grey 原文地址:http://www.cnblogs.com/greyzeng/p/6044837.html 我们可以在Github上管理自己的团队项目.团队 ...