ios关于数据库第三方框架FMDB进阶用法

概述

上一篇讲述了FMDB的最基本用法,用到的例子是缓存一张学生表,表里面都是些简单的字段。然而我们在实际项目开发中,大都使用FMDB缓存数据列表,比如网易新闻的新闻列表,QQ动态列表等。遵循MVC设计模式,我们请求下来的数据一般会建成数据模型,本编要讲的就是如何用FMDB缓存数据模型。下面就以新浪微博为例,看看如何使用FMDB缓存微博列表数据:

 

1、创建一个缓存微博数据的工具类DataBaseTool,点h文件如下

 

 1 /**
 2  *  缓存数据模型
 3  *
 4  *  @param status 一条微博模型
 5  */
 6
 7 +(void)addModel:(CZStatus*)status;
 8
 9 /**
10  *  缓存数据模型
11  *
12  *  @param array 微博模型数组
13  */
14 +(void)addModelWithArray:(NSArray*)array;
15
16 /**
17  *  查询数据库
18  *
19  *  @param param 参数模型
20  *
21  *  @return 模型数组,里面装的是微博模型
22  */
23
24 +(NSArray*)selectModelDataWith:(StatusParam*)param;

 

    注:这里只实现两个数据库操作方法,一个添加数据,一个读取数据。

 

 

点m文件如下

 

  1 /**
  2  *  工具类第一次使用时会调用此方法,而且只调用一次
  3  */
  4 +(void)initialize
  5 {
  6     //创建数据库存放沙盒路径
  7     NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
  8     NSString *path1 = [path stringByAppendingPathComponent:@"statues.sqlite"];
  9     //实例化数据库队列对象
 10     _queue = [[FMDatabaseQueue alloc] initWithPath:path1];
 11     //创表,除了主键id还有三个字段,token:授权登录的token idstr:微博id  model:微博模型
 12     [_queue inDatabase:^(FMDatabase *db) {
 13         BOOL result =[db executeUpdate:@"create table if not exists s_statues(id integer primary key autoincrement,token text,idstr text,model blob);"];
 14         if (result) {
 15             NSLog(@"创表成功");
 16         }
 17     }];
 18
 19
 20 }
 21
 22
 23 /**
 24  *  缓存数据模型
 25  *
 26  *  @param status 数据模型
 27  */
 28
 29 +(void)addModel:(CZStatus*)status
 30 {
 31     [_queue inDatabase:^(FMDatabase *db) {
 32
 33         NSString *token = [AccountTool account].access_token;
 34         NSString *idstr = status.idstr;
 35         //把模型通过归档转换成二进制数据
 36         NSData *data = [NSKeyedArchiver archivedDataWithRootObject:status];
 37         //把数据插入数据库
 38         [db executeUpdate:@"insert into s_statues(token,idstr,model) values(?,?,?);",token,idstr,data];
 39
 40
 41     }];
 42 }
 43
 44 /**
 45  *  缓存数据模型
 46  *
 47  *  @param array 要缓存的模型数组
 48  */
 49 +(void)addModelWithArray:(NSArray*)array
 50 {
 51     for (CZStatus *status in array) {
 52         [self addModel:status];
 53     }
 54 }
 55
 56
 57 /**
 58  *  查询数据库
 59  *
 60  *  @param param 参数模型
 61  *
 62  *  @return 模型数组
 63  */
 64
 65 +(NSArray*)selectModelDataWith:(StatusParam*)param
 66 {
 67     __block NSMutableArray *array = nil;
 68     [_queue inDatabase:^(FMDatabase *db) {
 69         array = [NSMutableArray array];
 70          FMResultSet *set = nil;
 71         NSNumber *count = param.count ? param.count : @20;
 72         /**
 73          *  sql查询语句
 74          *
 75          *  条件1: where token = ? token一定要是当前登录token
 76             条件2: idstr > ? or idstr <= ?  查询的微博id,如果since_id有值说明要查询更新的微博,如果Maxid   有值得,说明要查询更早的微博
 77          *  条件3:order by idstr desc    按照字段dstr 降序排列
 78             条件4:limit 0,?  限制查询的条数,此条件要放到最后,第一个数字指定查询到行的偏移量,设为0表示偏移量从第一条数据开始算起,设为1,表示偏移量从第二条数据开始算起,第二个数字是指定查询的数量
 79          */
 80
 81         if (param.since_id) {
 82             set =  [db executeQuery:@"select *from s_statues where token = ? and idstr > ? order by idstr desc limit 0,?;",param.access_token,param.since_id,count];
 83
 84         }else if (param.max_id){
 85             set =  [db executeQuery:@"select *from s_statues where token = ? and idstr <= ? order by idstr desc limit 0,?;",param.access_token,param.max_id,count];
 86         }else{
 87             set =  [db executeQuery:@"select *from s_statues where token = ?  order by idstr desc limit 0,?;",param.access_token,count];
 88         }
 89
 90
 91         //遍历结果集
 92         while (set.next) {
 93             //取出模型数据
 94             NSData *data = [set dataForColumn:@"model"];
 95             //反归档
 96             CZStatus *status = [NSKeyedUnarchiver unarchiveObjectWithData:data];
 97             [array addObject:status];
 98         }
 99
100     }];
101     return array;
102 }

 注:缓存的微博模型是一个oc对象,这里需要把它转换成二进制数据才能存入数据库。

 

 2、使用工具类在网络请求方法中缓存数据,先查询数据库,如果有数据,则取数据库的数据,如果没有,再发送网络请求

 1 /**
 2  *  请求微博数据
 3  *
 4  *  @param param   请求参数模型
 5  *  @param success 请求成功后的回调
 6  *  @param failure 请求失败后的回调
 7  */
 8
 9 +(void)homeStatusWithParam:(StatusParam*)param success:(void(^)(StatusResult *result))success failure:(void(^)(NSError *error))failure
10 {
11        //缓存模型
12
13     //先查询数据库,如果有数据,则取数据库的数据,如果没有,再发送网络请求
14     NSArray *baseArray = [DataBaseTool selectModelDataWith:param];
15     if (baseArray.count ) {
16         StatusResult *result = [[StatusResult alloc] init];
17         result.statuses = baseArray;
18         if (success) {
19             success(result);
20         }
21
22     }else{
23
24         //param.keyValues 模型
25         [CZHttpTool getRequestWithUrl:@"https://api.weibo.com/2/statuses/home_timeline.json" params:param.keyValues success:^(id json) {
26             //把请求结果字典json 转换为模型数据StatusResult,让控制器完全面向模型开发
27             StatusResult *result = [StatusResult objectWithKeyValues:json];
28
29             //一请求成功,那到微博模型数据,存入数据库
30             [DataBaseTool addModelWithArray:result.statuses];
31
32
33             if (success) {
34                 success(result);
35             }
36         } failure:^(NSError *error) {
37             if (failure) {
38                 failure(error);
39             }
40         }];
41
42
43     }
44
45

 注:objectWithKeyValues: 这个方法是mj的字典转模型框架——"MJExtension",有兴趣的朋友可以了解下。

时间: 2024-10-30 16:28:52

ios关于数据库第三方框架FMDB进阶用法的相关文章

需要可以可以拖动滚动条chart的IOS开发的第三方框架,求推荐!!

问题描述 需要可以可以拖动滚动条chart的IOS开发的第三方框架,求推荐!! ios开发中关于charts的第三方框架中,有没有类似安卓中hellocharts那种,可以拖动下面滚动条功能的框架?并且可以捕捉点击某个点事件.

iOS - Quartz 2D 第三方框架 Charts 绘制图表

1.Charts 简介 使用第三方框架 Charts 绘制 iOS 图表.GitHub 源码 Charts Charts 是一款用于绘制图表的框架,可以绘制柱状图.折线图.K线图.饼状图等.Charts 只有 Swift 版本. LineChart (with legend, simple design) LineChart (with legend, simple design) LineChart (cubic lines) LineChart (gradient fill) Combine

iOS之github第三方框架(持续更新)

1.MBProgressHUD MBProgressHUD是一个开源项目,实现了很多种样式的提示框 使用上简单.方便,并且可以对显示的内容进行自定义,功能很强大,很多项目中都有使用到. 到Github上可以下载到项目源码https://github.com/jdg/MBProgressHUD 百度云链接: http://pan.baidu.com/s/1pKa5JrP 密码: qw6k 百度云链接: http://pan.baidu.com/s/1dErLfrz 密码: ixbn (小码哥进一步

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

一.简单说明 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

iOS - SQLite 数据库存储

1.SQLite 数据库 SQLite 是一种轻型的嵌入式数据库,安卓和 iOS 开发使用的都是 SQLite 数据库.它占用资源非常低,在嵌入式设备中,可能需要几百 K 的内存数据就够了.他的处理速度比 Mysql.PostgreSQL 这两款著名的数据库都要快.数据库的存储和 Excel 很像,以表(table)为单位.表由多个字段(列.属性.column)组成,表里面的每一行数据称为记录.数据库操作包含打开数据库.创建表,表的增.删.改.查. SQL(Structured Query La

iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角)

图像: 1.图片浏览控件MWPhotoBrowser        实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网络下载图片并进行缓存.可对图片进行缩放等操作.       下载:https://github.com/mwaterfall/MWPhotoBrowser   目前比较活跃的社区仍旧是Github,除此以外也有一些不错的库散落在Google Code.SourceForge等地方.由于Github社区太过主流,这里主要介绍一下Gith

常用iOS的第三方框架

图像:1.图片浏览控件MWPhotoBrowser       实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网络下载图片并进行缓存.可对图片进行缩放等操作.      下载:https://github.com/mwaterfall/MWPhotoBrowser 目前比较活跃的社区仍旧是Github,除此以外也有一些不错的库散落在Google Code.SourceForge等地方.由于Github社区太过主流,这里主要介绍一下Github里面流

iOS开发之音频解析第三方框架介绍

最近在做iOS音频相关的App,在做之前选择了三种解决方案.第一种方案是使用苹果自带的音频解析类AVPlayer,虽然AVPlayer也可以播放音频.但是要做类似于QQ音乐这样的App,使用AVPlayer就显得无能为力了.第二种解决方案使用第三方音频解析框架AudioStreamer,这是一个老外写的音频解析框架.其中包括本地和网络的音频数据解析.核心文件 AudioPlayer.h 和 AudioPlayer.m.这套框架使用的是CFNetwork和CoreAudio封装的.其集成了进度拖动

第三方框架/服务/类库介绍链接汇总

1.一个很不错的引导页面构建框架 https://github.com/mamaral/Onboard 2.当前比较实用的几个ios第三方框架 http://www.cocoachina.com/ios/20150505/11752.html 3.ios系统框架介绍 http://www.cnblogs.com/wj033/p/4225660.html 4.知名ios应用的第三方类库 http://blog.csdn.net/guojin08/article/details/42222637 5