很多的APP都在没有网络的时候会保存上一次加载的数据,他们最常用的就是使用SQLite数据库,其中FMDB也是封装比较好的框架之一,下面来分享一下FMDB的使用!
- 下载并导入框架就没什么好说的了
- 创建一个管理的工具类(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];
网友评论