您的位置:首页 > 数据库

iOS项目开发中常用到的数据库之FMDB的使用

2016-09-05 16:24 429 查看
什么是FMDB

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

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

●  FMDB的优点

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

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

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

●  FMDB的github地址

●  https://github.com/ccgus/fmdb


FMDB有三个主要的类

FMDatabase

一个FMDatabase对象就代表一个单独的SQLite数据库•
用来执行SQL语句


FMResultSet

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


FMDatabaseQueue

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

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

FMDatabase *db = [FMDatabasedatabaseWithPath:path];

if (![dbopen]) {

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

}

文件路径有三种情况
1.具体文件路径
   如果不存在会自动创建
2. 空字符串@""
会在临时目录创建一个空的数据库
当FMDatabase连接关闭时,数据库文件也被删除
3. nil

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

在FMDB中,除查询以外的所有操作,都称为“更新”
create、drop、insert、update、delete等
使用executeUpdate:方法执行更新
- (BOOL)executeUpdate:(NSString*)sql,
...
- (BOOL)executeUpdateWithFormat:(NSString*)format,...
- (BOOL)executeUpdate:(NSString*)sqlwithArgumentsInArray:(NSArray*)arguments

示例
[dbexecuteUpdate:@"UPDATEt_studentSET
age = ? WHERE name = ?;", @20,
@"Jack"]

查询方法
- (FMResultSet *)executeQuery:(NSString*)sql,
...
- (FMResultSet *)executeQueryWithFormat:(NSString*)format,...
- (FMResultSet *)executeQuery:(NSString
*)sqlwithArgumentsInArray:(NSArray*)arguments
示例
// 查询数据

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

// 遍历结果集

while ([rsnext]) {

   NSString*name = [rsstringForColumn:@"name"];

   int age= [rsintForColumn:@"age"];

   doublescore = [rsdoubleForColumn:@"score"];

}

FMDatabase的线程问题

FMDatabase这个类是线程不安全的,如果在多个线程中同时使用一个FMDatabase实例,会造成数据混乱等问题
为了保证线程安全,FMDB提供方便快捷的FMDatabaseQueue类
FMDatabaseQueue的创建

FMDatabaseQueue*queue = [FMDatabaseQueuedatabaseQueueWithPath:path];

1. 简单使用

[queue inDatabase:^(FMDatabase *db)
{

   [dbexecuteUpdate:@"INSERTINTO
t_student(name)VALUES (?)",@"Jack"];

   [dbexecuteUpdate:@"INSERTINTO
t_student(name)VALUES (?)",@"Rose"];

   [dbexecuteUpdate:@"INSERTINTO
t_student(name)VALUES (?)",@"Jim"];

   

   FMResultSet *rs = [dbexecuteQuery:@"select*
from t_student"];

   while ([rsnext]) {

        // …

   }

}];

2. 使用事务
[queue inTransaction:^(FMDatabase *db,
BOOL*rollback) {

   [dbexecuteUpdate:@"INSERTINTO
t_student(name)VALUES (?)",@"Jack"];

   [dbexecuteUpdate:@"INSERTINTO
t_student(name)VALUES (?)",@"Rose"];

   [dbexecuteUpdate:@"INSERTINTO
t_student(name)VALUES (?)",@"Jim"];

   

   FMResultSet *rs = [dbexecuteQuery:@"select*
from t_student"];

   while ([rsnext]) {

        // …

   }

}];

事务回滚
*rollback = YES;

#pragma mark  ---------------------   这里写个demo,实现它的增删改查功能 --------------

流程步骤: 倒入sqlite3.0,倒入FMDB框架

这里直接往控制器上托



这里第一步建表

    NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];

    // 拼接文件名

    NSString *filePath = [cachePath stringByAppendingPathComponent:@"contact.sqlite"];

    // 创建一个数据库的实例,仅仅在创建一个实例,并会打开数据库

    FMDatabase *db = [FMDatabase databaseWithPath:filePath];

    _db = db;

    // 打开数据库

    BOOL flag = [db open];

    if (flag) {

        NSLog(@"打开成功");

    }else{

        NSLog(@"打开失败");

    }

    

    // 创建数据库表

    // 数据库操作:插入,更新,删除都属于update

    // 参数:sqlite语句

    

   BOOL flag1 = [db executeUpdate:@"create table if not exists t_contact (id integer primary key autoincrement,name text,phone text);"];

    if (flag1) {

        NSLog(@"创建成功");

    }else{

        NSLog(@"创建失败");

    }

下面是上面按钮对应的方法

- (IBAction)select:(id)sender {

    

  FMResultSet *result =  [_db executeQuery:@"select * from t_contact"];

    

    // 从结果集里面往下找

    while ([result next]) {

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

        NSString *phone = [result stringForColumn:@"phone"];

        NSLog(@"%@--%@",name,phone);

    }

    

}

- (IBAction)update:(id)sender {

    // FMDB?,只能是对象,不能是基本数据类型,如果是int类型,就包装成NSNumber

    BOOL flag = [_db executeUpdate:@"update t_contact set name = ?",@"abc"];

    if (flag) {

        NSLog(@"success");

    }else{

        NSLog(@"failure");

    }

}

- (IBAction)insert:(id)sender {

    // ?:表示数据库里面的占位符

   BOOL flag = [_db executeUpdate:@"insert into t_contact (name,phone) values (?,?)",@"ss",@"1111"];

    if (flag) {

        NSLog(@"success");

    }else{

         NSLog(@"failure");

    }

    

}

- (IBAction)delete:(id)sender {

    BOOL flag = [_db executeUpdate:@"delete from t_contact;"];

    if (flag) {

        NSLog(@"success");

    }else{

        NSLog(@"failure");

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: