使用FMDB保存首页数据

作者: xiao小马哥 | 来源:发表于2016-07-14 15:10 被阅读1341次
FD87DC16F4A42922C5DFDCCF96332A13.jpg

很多的APP都在没有网络的时候会保存上一次加载的数据,他们最常用的就是使用SQLite数据库,其中FMDB也是封装比较好的框架之一,下面来分享一下FMDB的使用!

  1. 下载并导入框架就没什么好说的了
  2. 创建一个管理的工具类(SQLiteManager)继承NSObject
    SQLiteManager.m 里面的内容如下,我写的是类方法,你也可以写对象方法,在弄一个单例什么的,写类方法主要是为了方便!

说一下项目的背景 :我们首页数据返回来的是一个json,通过框架直接转成了字典,领导要求只保存第一页数据就可以,所以我没有把所有的数据按照字段去解析存储,我是直接存储的json数据,也省去了以后的项目开发中增加新的字段,需要对数据库升级的麻烦只能说我比较懒废话说了这么多下面是代码!!!

/// 更新数据
///
/// @param data 数据
/// @param page 页码
+ (void)updateHomeData:(NSString *)data page:(NSUInteger)page;

/// 插入数据
///
/// @param data 数据
/// @param page 页码
+ (void)insertHomeData:(NSString *)data page:(NSUInteger)page;

/// 查询数据
+ (NSArray *)queryHomeData;

/// 删除数据
///
/// @param page 页码
+ (void)deleteHomeDataWithPage:(NSInteger)page;

3.在SQLiteManager.h文件中代码如下:

//定义一个全局对象
static FMDatabase *_db;

//该方法会在调用该类中方法的时候先调用
+ (void)initialize{
NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

NSString *dbFilePath = [documentPath stringByAppendingPathComponent:@"homeData.db"];

//1.创建库
_db = [FMDatabase databaseWithPath:dbFilePath];

//2.打开连接
BOOL result = [_db open];

if (result) {
    //3.创建表
    /**
     如果是创建表,新增数据,修改数据,删除数据,我们都一个方法
     executeUpdate
     如果是查询executeQuery
     */
    BOOL result2 = [_db executeUpdate:@"create table if not exists t_home(id integer primary key,data text not null,page integer not null);"];
    if (result2) {
        NSLog(@"创建表成功!!!");
    }
}

}

//添加数据
+ (void)insertHomeData:(NSString *)data page:(NSUInteger)page{
[_db executeUpdateWithFormat:@"insert into t_home(data,page) values(%@,%ld)",data,page];
}

//更新数据
+ (void)updateHomeData:(NSString *)data page:(NSUInteger)page{
[_db executeUpdateWithFormat:@"update t_home set data=%@,page = %ld",data,page];
}

//删除数据
+ (void)deleteHomeDataWithPage:(NSInteger)page{
[_db executeUpdateWithFormat:@"delete from t_home where page = %ld",page];
}
//查询数据
+ (NSArray *)queryHomeData{

FMResultSet *resultSet = [_db executeQuery:[NSString stringWithFormat:@"select * from t_home"]];
// 如果你想查询某个字段可以这么写(注意%号的个数)
//    FMResultSet *resultSet = [_db executeQuery:[NSString stringWithFormat:@"select * from t_home where name LIKE '%%%@%%'",zhangsan]];
NSMutableArray *homeDatas = [NSMutableArray array];

while (resultSet.next) {
    NSString *homeData = [resultSet stringForColumn:@"data"];
// 将字符串转换成对象(下面会说为什么存字符串!!!)
    NSData *data = [homeData dataUsingEncoding:NSUTF8StringEncoding];
    NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:NULL];
    //将其添加到数组中
    [homeDatas addObject:array];
}

return homeDatas.copy;
}

4.使用FMDB(重点来了!!!)
在请求数据之前先加载数据库中的数据

// 取出数据库中的数据,判断是否有数据
NSArray *array = [SQLiteManager queryHomeData];
    if (array && array.count > 0) {
// 字典转模型
    InformationReturnData * returnData = [InformationReturnData mj_objectWithKeyValues:array.firstObject];
    self.listDataArray = returnData.data;
    [self.tableView reloadData];
}
else
{
    // 没有重数据库中加载到数据,向服务器请求数据
    [self requestDataWithPage:self.page];
}

5.下面是写入数据到数据库(肯定是在数据请求回来之后了~废话!)

NSError *err = nil;
// 此处是将对象转成json字符串写入到数据库中(数据库里不能存对象,你不会不知道吧~)
NSData *data = [NSJSONSerialization dataWithJSONObject:jsonData options:NSJSONWritingPrettyPrinted error:&err];
NSString *jsonStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSInteger page = returnData.page;
// 删除之前的旧数据
[SQLiteManager deleteHomeDataWithPage:page];
// 保存新的数据
[SQLiteManager insertHomeData:jsonStr page:page];

总结:这个是我重项目里分离出来的,就没有demo了,欢迎大家点赞和评论,有不懂的直接留言,我也不一定会哈!

相关文章

网友评论

  • 一束强光:不知道有没有将数据库导出为excel的方法?
  • Ego_1973:楼主数组怎么保存啊?我model里有个数据是arr类型,存的时候转成data,取怎么办呢?本身还是arr但是值是data了...一般在哪里控制知道请求有没有新增数据呢?
    皮乐皮儿:@带我逃跑吧 嗯,数组,字典,图片,以及你自定义的数据模型,如果想要整体存储,必须转换成二进制流,也就是NSData数据,取出来的时候再解归档就变成原本的类型了
    Ego_1973:@顾语流年 额,就是全部转化成data?和图片一样?
    皮乐皮儿:数据库不能直接保存Array,dictionary等类型,需要归档成二进制流存储,取出来依然是二进制流,需要进行解归档就可以转成你存储之前的数据类型了
  • 鑫龙魂:为什么使用数据库,就保存那么少的数据?

本文标题:使用FMDB保存首页数据

本文链接:https://www.haomeiwen.com/subject/devejttx.html