iOS 数据库篇8—FMDB数据库队列

转载 2016年05月30日 10:12:44

一、代码示例

1.导入FMDB框架

需要先导入FMDB框架和头文件,由于该框架依赖于libsqlite库,所以还应该导入该库。
image

2.代码

代码如下:

//
//  YYViewController.m
//  05-FMDB数据库队列
//
//  Created by apple on 14-7-28.
//  Copyright (c) 2014年 wendingding. All rights reserved.
//

#import "YYViewController.h"
#import "FMDB.h"

@interface YYViewController ()
@property(nonatomic,strong)FMDatabaseQueue *queue;
@end

@implementation YYViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    //1.获得数据库文件的路径
    NSString *doc=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *fileName=[doc stringByAppendingPathComponent:@"person.sqlite"];

    //2.获得数据库队列
    FMDatabaseQueue *queue=[FMDatabaseQueue databaseQueueWithPath:fileName];
//    FMDatabase *db=[FMDatabase databaseWithPath:fileName];

    //3.打开数据库
    [queue inDatabase:^(FMDatabase *db) {
         BOOL result=[db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_person (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);"];
        if (result) {
            NSLog(@"创表成功");
        }else
        {
            NSLog(@"创表失败");
        }
    }];
    self.queue=queue;

}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    //插入数据
//    [self.queue inDatabase:^(FMDatabase *db) {
//        [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @22];
//    }];

    //查询数据
    [self.queue inDatabase:^(FMDatabase *db) {
        // 1.执行查询语句
        FMResultSet *resultSet = [db executeQuery:@"SELECT * FROM t_person"];

        // 2.遍历结果
        while ([resultSet next]) {
            int ID = [resultSet intForColumn:@"id"];
            NSString *name = [resultSet stringForColumn:@"name"];
            int age = [resultSet intForColumn:@"age"];
            NSLog(@"%d %@ %d", ID, name, age);
        }
    }];

}

@end

先插入数据,之后查询结果,打印如下:
image

3.代码说明

有了一个队列对象,它的内部自动就拥有一个数据库对象,且数据库的操作是线程安全的。
image

二、事务

事务,没有事务的话会出现问题。
举例:银行的例子
image

张三和李四账户都有1000块钱,如果张三要转账给李四,需要执行两条SQL语句,考虑到安全性,要求这两条鱼具要么全部执行成功,要不全部执行失败。
事务:把多条语句放到同一个事务中,要么全部成功,要不全部失败(如果中途出现问题,那么会自动回滚)。事务的执行具有原子性。
  事务代码处理:
  把多条语句添加到一个事务中去执行:

//插入数据
    [self.queue inDatabase:^(FMDatabase *db) {
        [db beginTransaction];
        [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @22];
        [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @23];
        [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @24];
        [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @25];
        [db commit];
    }];

如果中途出现问题,那么会自动回滚,也可以选择手动回滚。

//插入数据
    [self.queue inDatabase:^(FMDatabase *db) {
        [db beginTransaction];
        [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @22];
        [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @23];
        [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @24];
        [db rollback];
        [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @25];
        [db commit];
    }];

上面的代码。前三条插入语句是作废的。

事务处理的另一种方式:

   [self.queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
        [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @22];
        [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @23];
        [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @24];
    }];

说明:先开事务,再开始事务,之后执行block中的代码段,最后提交事务。

fmdb中databasequeue的使用,避免死锁

在ios开发中,大家很可能会用到这样一个数据库封装:fmdb. 该封装相比coredata来说有他自己的优势:接口清晰,设计简单,符合规范,多线程情况下使用databasequeue来进行操作也很方...
  • openglnewbee
  • openglnewbee
  • 2014年05月21日 11:25
  • 7830

IOS:FMDB使用databaseQueue实现数据库操作线程安全

sqlite数据库是ios开发中经常使用到的数据持久化方案,因为项目需求的不同,对数据库操作的要求也不同。 由于最近使用sqlite时,有一些地方需要频繁的更新,这时在多线程操作时,其他线程访问数据...
  • qishiai819
  • qishiai819
  • 2016年05月13日 13:04
  • 6014

IOS 之使用FMDB进行SQLite数据库操作——表的创建与修改,以及数据的增删改查和多线程操作数据库

因为IOS中的数据库API在使用上非常复杂繁琐,我们在对SQLite数据库进行操作时通常使用第三方封装的库FMDB FMDB同时兼容ARC和非ARC工程,会自动根据工程配置来调整相关的内存管...
  • liwei5bao
  • liwei5bao
  • 2015年12月14日 17:05
  • 3956

iOS学习笔记(十六)——数据库操作(使用FMDB)

iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便。于是,就出现了一系列将SQLite API进行封装的库,例如FMDB、PlausibleDatabase、sqlitepers...
  • xyz_lmn
  • xyz_lmn
  • 2013年07月15日 23:19
  • 151973

iOS开发(OC)——FMDB数据库的使用

在开发的过程中,难免会使用到数据库来存储和处理数据。iOS除了自带的coreData数据库外,还支持第三方FMDB数据库。FMDB数据库支持SQL语句,适合中小型数据库的存储和处理,深受中小型企业的青...
  • liumude123
  • liumude123
  • 2016年05月15日 14:19
  • 1193

数据库操作(使用FMDB)

iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便。于是,就出现了一系列将SQLite API进行封装的库,例如FMDB、PlausibleDatabase、sqlitepers...
  • mr_liu_easy_ios
  • mr_liu_easy_ios
  • 2016年05月24日 09:38
  • 3179

iOS-FMDB 更新数据库表结构

接上一篇增删改查: http://blog.csdn.net/sinat_30162391/article/details/49622841这一篇介绍更新表结构// 创建数据库 - (FMData...
  • sinat_30162391
  • sinat_30162391
  • 2016年11月07日 00:24
  • 1489

IOS 数据库FMDB(四)- (增、删、改、查)

参考:http://wenku.baidu.com/link?url=TK90OOhfVLK_2N5ZalNS5-hB_a5_Bxb7WLCx5ryzfOxHkCw8mW7tMAe63s-lpP0gz...
  • Jason_chen13
  • Jason_chen13
  • 2016年06月20日 17:44
  • 3339

iOS数据库的使用方法(FMDB)

一、下面简单的介绍一下FMDB的相关信息: 1.FMDB是iOS平台SQLite数据库框架,以OC的方式封装了SQLite的C语言的API 2.在诸多的数据库框架中,为什么FMDB能够如此的受开发...
  • u011452278
  • u011452278
  • 2015年11月04日 14:45
  • 625

iOS开发数据库篇—FMDB简单介绍

iOS开发数据库篇—FMDB简单介绍 一、简单说明 1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API ...
  • l863784757
  • l863784757
  • 2015年02月10日 10:08
  • 5843
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS 数据库篇8—FMDB数据库队列
举报原因:
原因补充:

(最多只允许输入30个字)