本地缓存FMDB的使用(iOS)

一、简单说明

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)空字符串@""

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

  当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什在日常的开发中,我们需要用到离线缓存将数据信息存入数据库,在没有网络的时候进行加载,而我们IOS用的就是sqlite3数据库,用原生的sql我们也能实现,但是书写起来比较麻烦,尤其是其它语言转过来的程序员会感觉吃力,下面我们介绍一款比较优秀还简单的第三方FMDB

2 FMDB的下载地址 https://github.com/ccgus/fmdb

3在FMDB下载文件后,工程中必须导入如下文件,并使用 libsqlite3.dylib 依赖包

4 FMDB常用类

FMDatabase : 一个单一的SQLite数据库,用于执行SQL语句。

FMResultSet :执行查询一个FMDatabase结果集。

FMDatabaseQueue :在多个线程来执行查询和更新时会使用这个类

5操作数据库

1 创建并且打开数据库

   // 1 获取数据库对象
    NSString *path=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; path=[path stringByAppendingPathComponent:@"test.sqlite"]; dataBase=[FMDatabase databaseWithPath:path]; // 2 打开数据库,如果不存在则创建并且打开 BOOL open=[dataBase open]; if(open){ NSLog(@"数据库打开成功"); } //3 创建表 NSString * create1=@"create table if not exists t_user(id integer autoincrement primary key,name varchar)"; BOOL c1= [dataBase executeUpdate:create1]; if(c1){ NSLog(@"创建表成功"); } //4 插入数据 NSString * insertSql=@"insert into t_user(id,name) values(?,?)"; // 插入语句1 bool inflag1=[dataBase executeUpdate:insertSql,@(2),@"admin"]; // 插入语句2 bool inflag2=[dataBase executeUpdate:insertSql withArgumentsInArray:@[@"admin",@(5)]]; // 插入语句3 bool inflag3=[dataBase executeUpdateWithFormat:@"insert into t_user(id,name) values(%@,%d)",@"admin",6]; // 删除语句 NSString * delete=@"delete from t_user"; BOOL dflag= [dataBase executeUpdate:delete]; if(dflag){ NSLog(@"删除成功"); } // 修改语句 NSString *update=@" update t_user set name=? "; BOOL flag= [dataBase executeUpdate:update,@"zhangsan"]; if(flag){ NSLog(@"修改成功"); } // 5查询数据FMDB的FMResultSet提供了多个方法来获取不同类型的数据 NSString * sql=@" select * from t_user "; FMResultSet *result=[dataBase executeQuery:sql]; while(result.next){ int ids=[result intForColumn:@"id"]; NSString * name=[result stringForColumn:@"name"]; int ids=[result intForColumnIndex:0]; NSString * name=[result stringForColumnIndex:1]; NSLog(@"%@,%d",name,ids); } 

如果应用中使用了多线程操作数据库,那么就需要使用FMDatabaseQueue来保证线程安全了。 应用中不可在多个线程中共同使用一个FMDatabase对象操作数据库,这样会引起数据库数据混乱。 为了多线程操作数据库安全,FMDB使用了FMDatabaseQueue,使用FMDatabaseQueue很简单,首先用一个数据库文件地址来初使化FMDatabaseQueue,然后就可以将一个闭包(block)传入inDatabase方法中。 在闭包中操作数据库,而不直接参与FMDatabase的管理

//2多线程操作
      NSString *path=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; path=[path stringByAppendingPathComponent:@"test.sqlite"]; FMDatabaseQueue * queue=[FMDatabaseQueue databaseQueueWithPath:path]; [queue inDatabase:^(FMDatabase *db) { NSString * create=@"create table if not exists t_book(id integer,name varchar)"; BOOL c1= [db executeUpdate:create]; if(c1){ NSLog(@"成功"); } }]; [queue inDatabase:^(FMDatabase *db) { NSString * insertSql=@"insert into t_book(id,name) values(?,?)"; //插入语句1 bool inflag=[db executeUpdate:insertSql,@(2),@"admin"]; if(inflag){ NSLog(@"插入成功"); } }]; [queue inDatabase:^(FMDatabase *db) { FMResultSet * data=[db executeQuery:@" select * from t_book "]; while (data.next) { int ids=[data intForColumn:@"id"]; NSString *name=[data stringForColumn:@"name"]; NSLog(@"%@",name); NSLog(@"%i",ids); } }];

转载于:https://www.cnblogs.com/Yun-Longcom/p/6008724.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值