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. Android随笔之——按键长按事件onKeyLongPress

    现在安卓手机实体键是越来越少了,但还是有的,恰好自己就碰上了:按键的长按事件...百度了一些博客,内容都基本上是完全一样的,虽然可以捕获到长按事件,但却会和正常的单击冲突.幸好最近开个VPN,goog ...

  2. EntityFramework 7 Left Join Where Select 奇怪问题

    这篇博文纪录一下:使用 EF7,当 Linq 查询中使用 "Left Join" 语法(DefaultIfEmpty),Where Select 不同条件语法实现,出现的不同问题. ...

  3. C# 设置word文档页面大小

    我们知道,在MS word中,默认的页面大小是letter(8.5’’x11’’),除此之外,word还提供了其他一些预定义的页面大小,如Legal (5.4’’x14’’),A3 (11.69’’x ...

  4. 关于CLR、CIL、CTS、CLS、CLI、BCL和FCL 的区分与总结

    关于CLR.CIL.CTS.CLS.CLI.BCL和FCL 的区分与总结 如果要想深入学习.NET平台,那么标题中的这些关键字对你来说并不陌生,这些名词构成了.NET庞大的生态系统,为了宏观认识.NE ...

  5. h5直播开发之旅总结

    前言 关于直播,有很多相关技术文章,这里不多说. 作为前端,我们比较关心我们所需要的. 直播的大致流程: APP端调用摄像头 -> 拍摄视频 -> 实时上传视频 -> 服务器端获取视 ...

  6. (十六)WebGIS中偏移补偿量引发的问题之探讨

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 在上一章里讲解地图平移功能的实现时,我在最后提出了两个问题: ...

  7. C#文件相同性判断

    在进行开发时,对文件进行上传和下载是较为普遍的行为,为了防止在文件操作过程中,出现同一文件多次操作,需要对文件进行相同性比较: 1.获取文件的绝对路径,针对window程序和web程序都可使用: // ...

  8. 用JqueryUI的Dialog+IFrame实现仿模态窗口效果

    大家有没有想过这样一个问题,当我点击某个图片的时候,我想弹出这个图片信息的详情并修改,于是你首先想到的是不是window.open?window.open方法确实可以,但是有它的局限性,比如,标题显示 ...

  9. 用JPUSH极光推送实现服务端向安装了APP应用的手机推送消息(C#服务端接口)

    这次公司要我们做一个功能,就是当用户成功注册以后,他登录以后要收到消息,当然这个消息是安装了我们的手机APP应用的手机咯. 极光推送的网站的网址是:https://www.jpush.cn/ 极光推送 ...

  10. PHP配置限制文件大小上传

    修改PHP上传文件大小限制的方法1. 一般的文件上传,除非文件很小.就像一个5M的文件,很可能要超过一分钟才能上传完.但在php中,默认的该页最久执行时间为 30 秒.就是说超过30秒,该脚本就停止执 ...