您的位置:首页 > 移动开发 > IOS开发

iOS FMDataBase 实现离线缓存

2016-11-07 14:48 176 查看
controller

//徒步去旅行

@interface ViewController ()

@property (nonatomic,strong) NSMutableArray *array;

@end

@implementation ViewController

-(void)initData

{

//1.先读本地数据

self.array = [[TQDataBase sharedDataBase] getAllMovies];

}

-(void)requestData

{

AFHTTPRequestOperationManager *man = [AFHTTPRequestOperationManager manager];

[man GET:@"http://api.douban.com/v2/movie/top250?apikey=02d830457f4a8f6d088890d07ddfae47&start=0&count=20" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {

//清空之前的数据   (数据库,数据源(array))
if([[TQDataBase sharedDataBase] isDataExists])
{
[[TQDataBase sharedDataBase] deleteAllDatas];
[self.array removeAllObjects];
}

for (NSDictionary *dict in responseObject[@"subjects"]) {
TQMovie *movie = [[TQMovie alloc] init];

movie.movieImage = dict[@"images"][@"small"];
movie.movieTitle = dict[@"title"];

//把movie缓存到数据库
[[TQDataBase sharedDataBase] insertMovie:movie];

[self.array addObject:movie];
}

[self.tableView reloadData];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

}];


}

(void)viewDidLoad {

[super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

//1.先读本地数据

//2.判断网络状态 —> 加载新数据 NO 提示网络错误的信息

//3.加载新数据 —> 把之前数据库中的数据清空 新数据保存到数据库

[self initData];

//判断网络状态

[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {

if(status == AFNetworkReachabilityStatusReachableViaWWAN || status == AFNetworkReachabilityStatusReachableViaWiFi)

{

[self requestData];

}

else

{

NSLog(@”请检查网络连接”);

}

}];

//开启检测

[[AFNetworkReachabilityManager sharedManager] startMonitoring];

}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

{

return self.array.count;

}

-(UITableViewCell )tableView:(UITableView )tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@”cell”];

TQMovie *movie = self.array[indexPath.row];

[cell.imageView sd_setImageWithURL:[NSURL URLWithString:movie.movieImage] placeholderImage:[UIImage imageNamed:@"photo"]];
cell.textLabel.text = movie.movieTitle;

return cell;


}

dataBase

@implementation TQDataBase

{

FMDatabase *_fmDataBase;

}

(instancetype)init

{

self = [super init];

if (self) {

NSString *docPath = [NSString stringWithFormat:@”%@/Documents/movie.db”,NSHomeDirectory()];

NSLog(@"%@",NSHomeDirectory());
//创建数据库 以及 创建表
_fmDataBase = [FMDatabase databaseWithPath:docPath];

//
[_fmDataBase open];

NSString *sqlStr = @"create table if not exists Movie (image text, title text)";

[_fmDataBase executeUpdate:sqlStr];

[_fmDataBase close];


}

return self;

}

+(TQDataBase *)sharedDataBase

{

static TQDataBase *dataBase = nil;

if(dataBase == nil)
{
dataBase = [[TQDataBase alloc] init];
}

return dataBase;


}

-(NSMutableArray *)getAllMovies

{

NSMutableArray *array = [[NSMutableArray alloc] init];

[_fmDataBase open];

FMResultSet *set = [_fmDataBase executeQuery:@"select * from Movie"];

while ([set next]) {
TQMovie *movie = [[TQMovie alloc] init];

movie.movieImage = [set stringForColumn:@"image"];
movie.movieTitle = [set stringForColumn:@"title"];

[array addObject:movie];
}

[_fmDataBase close];

return array;


}

-(BOOL)isDataExists

{

BOOL ret = NO;

[_fmDataBase open];

ret = [[_fmDataBase executeQuery:@"select * from Movie"] next];

[_fmDataBase close];

return ret;


}

-(void)deleteAllDatas

{

[_fmDataBase open];

[_fmDataBase executeUpdate:@"delete from Movie"];

[_fmDataBase close];


}

-(void)insertMovie:(TQMovie *)movie

{

[_fmDataBase open];

NSString *sqlStr = @"insert into Movie (image,title) values (?,?)";

[_fmDataBase executeUpdate:sqlStr,movie.movieImage,movie.movieTitle];

[_fmDataBase close];


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息