iOS开发中使用FMDB来使程序连接SQLite数据库

隽隽隽隽Jun

隽隽隽隽Jun

2016-02-19 10:38

最近很多朋友喜欢上设计,但是大家却不知道如何去做,别担心有图老师给你解答,史上最全最棒的详细解说让你一看就懂。

一、简单说明

1.什么是FMDB

FMDB是iOS平台的SQLite数据库框架

FMDB以OC的方式封装了SQLite的C语言API

2.FMDB的优点

使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码

对比苹果自带的Core Data框架,更加轻量级和灵活

提供了多线程安全的数据库操作方法,有效地防止数据混乱

3.FMDB的github地址

https://github.com/ccgus/fmdb

二、核心类

FMDB有三个主要的类

(1)FMDatabase

一个FMDatabase对象就代表一个单独的SQLite数据库

用来执行SQL语句

(2)FMResultSet

使用FMDatabase执行查询后的结果集

(3)FMDatabaseQueue

用于在多线程中执行多个查询或更新,它是线程安全的

三、打开数据库

通过指定SQLite数据库文件路径来创建FMDatabase对象

代码如下:

FMDatabase *db = [FMDatabase databaseWithPath:path];

if (![db open]) {

    NSLog(@"数据库打开失败!");

}

文件路径有三种情况

(1)具体文件路径

  如果不存在会自动创建

(2)空字符串@""

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  会在临时目录创建一个空的数据库

  当FMDatabase连接关闭时,数据库文件也被删除 

(3)nil

  会创建一个内存中临时数据库,当FMDatabase连接关闭时,数据库会被销毁

四、执行更新

在FMDB中,除查询以外的所有操作,都称为“更新”

create、drop、insert、update、delete等

使用executeUpdate:方法执行更新
代码如下:

- (BOOL)executeUpdate:(NSString*)sql, ...

- (BOOL)executeUpdateWithFormat:(NSString*)format, ...

- (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments

 

示例
代码如下:

[db executeUpdate:@"UPDATE t_student SET age = ? WHERE name = ?;", @20, @"Jack"]

 

五、执行查询

查询方法
代码如下:

- (FMResultSet *)executeQuery:(NSString*)sql, ...

- (FMResultSet *)executeQueryWithFormat:(NSString*)format, ...

- (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments

 

示例
代码如下:

// 查询数据

FMResultSet *rs = [db executeQuery:@"SELECT * FROM t_student"];

// 遍历结果集

while ([rs next]) {

    NSString *name = [rs stringForColumn:@"name"];

    int age = [rs intForColumn:@"age"];

    double score = [rs doubleForColumn:@"score"];

}

 
六、代码示例

1.新建一个项目,导入libsqlite3库,并在项目中包含主头文件

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

2.下载第三方框架FMDB

3.示例代码

  YYViewController.m文件
代码如下:

//
//  YYViewController.m
//  04-FMDB基本使用
//
//  Created by apple on 14-7-27.
//  Copyright (c) 2014年 wendingding. All rights reserved.
//

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

@interface YYViewController ()
@property(nonatomic,strong)FMDatabase *db;
@end

@implementation YYViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    //1.获得数据库文件的路径
    NSString *doc=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *fileName=[doc stringByAppendingPathComponent:@"student.sqlite"];
   
    //2.获得数据库
    FMDatabase *db=[FMDatabase databaseWithPath:fileName];
   
    //3.打开数据库
    if ([db open]) {
        //4.创表
        BOOL result=[db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);"];
        if (result) {
            NSLog(@"创表成功");
        }else
        {
            NSLog(@"创表失败");
        }
    }
    self.db=db;

}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self delete];
    [self insert];
    [self query];
}

//插入数据
-(void)insert
{
    for (int i = 0; i10; i++) {
        NSString *name = [NSString stringWithFormat:@"jack-%d", arc4random_uniform(100)];
        // executeUpdate : 不确定的参数用?来占位
        [self.db executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?, ?);", name, @(arc4random_uniform(40))];
        //        [self.db executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?, ?);" withArgumentsInArray:@[name, @(arc4random_uniform(40))]];
       
        // executeUpdateWithFormat : 不确定的参数用%@、%d等来占位
        //        [self.db executeUpdateWithFormat:@"INSERT INTO t_student (name, age) VALUES (%@, %d);", name, arc4random_uniform(40)];
    }
}

//删除数据
-(void)delete
{
    //    [self.db executeUpdate:@"DELETE FROM t_student;"];
    [self.db executeUpdate:@"DROP TABLE IF EXISTS t_student;"];
    [self.db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);"];
}

//查询
- (void)query
{
    // 1.执行查询语句
    FMResultSet *resultSet = [self.db executeQuery:@"SELECT * FROM t_student"];
   
    // 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

打印查看结果:

提示:

如果ID设置为逐渐,且设置为自动增长的话,那么把表中的数据删除后,重新插入新的数据,ID的编号不是从0开始,而是接着之前的ID进行编号。

注意:

  不要写成下面的形式,不要加'',直接使用%@,它会自动认为这是一个字符串。

七、FMDB数据库队列
1.代码示例

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

(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

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

(3).代码说明

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

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

张三和李四账户都有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中的代码段,最后提交事务。

展开更多 50%)
分享

猜你喜欢

iOS开发中使用FMDB来使程序连接SQLite数据库

编程语言 网络编程
iOS开发中使用FMDB来使程序连接SQLite数据库

SQLite数据库安全

PHP
SQLite数据库安全

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

轻型数据库SQLite结合PHP的开发

PHP
轻型数据库SQLite结合PHP的开发

在ASP中使用数据库

ASP
在ASP中使用数据库

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

VB程序如何连接数据库

编程语言 网络编程
VB程序如何连接数据库

使用Perl连接Mysql数据库

编程语言 网络编程
使用Perl连接Mysql数据库

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

U盘是由什么组成的呢

U盘是由什么组成的呢

clipbrd.exe是什么进程

clipbrd.exe是什么进程
下拉加载更多内容 ↓