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. SPIRE.DOC - .NET开发者的福利

    SPIRE.DOC - .NET开发者的福利 前面我们使用过Spire.XLS for .NET Component创建Excel文件.最近试用了下.DOC 方面的API.这次测试的产品是.通过使用S ...

  2. 如何在ios中集成微信登录功能

    在ios中集成微信的登录功能有两种方法 1 用微信原生的api来做,这样做的好处就是轻量级,程序负重小,在Build Settings 中这样设置 然后设置 友盟的设置同上,但是要注意,加入你需要的所 ...

  3. 1Z0-053 争议题目解析687

    1Z0-053 争议题目解析687 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 687.Users are connected to a database instance th ...

  4. SQL Server基础之索引

     索引用于快速找出在某个列中有某一特定值的行,不使用索引,数据库必须从第一条记录开始读完整个表,直到找出相关的行.表越大,查询数据所花费的时间越多,如果表中查询的列有一个索引,数据库能快速到达一个位置 ...

  5. Java进击C#——项目开发环境

    本章简言 上一章我们了解一下开发环境,知道了什么去新建一个项目工程.却并没有去项目工程进行介绍.可是之后我们会常常跟项目工程打交道.所以这章笔者就对项程工程的常用的一些功能进行讲解.当然说全面那是不可 ...

  6. C#播放MP3源代码

    代码如下: using System; using System.Runtime.InteropServices; using System.Text; using System.IO ; using ...

  7. Devexpress WPF Theme Editor 01

    在Devexpress中,已经有内置了很多主题样式.一般我们开发就已经够用了.但是随着客户的需求提高..我们要自己手动写一些样式这些的, 那么Devexpress 已经提供一个专门这样的工具. 下载地 ...

  8. 记住 MVC里用formcollection接收form表单传来的值,表单属性必须有name为健!

    记住 MVC里用formcollection接收form表单传来的值,input属性必须有name为健! 调了一晚上!! 写个日志记下!!

  9. [示例] Firemonkey 图片按钮(3态)

    说明:Firemonkey 图片按钮(支持三种状态:MouseOver, MouseDown, MouseUp,可各别指定图片) 原码下载:[示例]TestImageButton_圖片按鈕(3态).z ...

  10. java代码实现队列的优化

    package com.voole.queun; /** * @Decription 队列 * @author TMAC-J * */ public class Queun { /** * 初始化队列 ...