FD87DC16F4A42922C5DFDCCF96332A13.jpg
很多的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];