这是本人自己整理的FMDB,如有问题请见谅并指出,谢谢!。
要用fmdb缓存,首先要熟练使用SQLite指令,可以参考我的博客文@http://blog.csdn.net/icandyss/article/details/50670078
下面是我写的一个小Demo:
FMDB数据库最常用的就是增删改查,下面的demo主要是缓存了从网上请求下来的一些图片和其对应的标题。可以满足在断网或再次运行应用的情况下界面有数据。
- (void)viewDidLoad {
//应用刚运行的时候,首先要判断是否有已经有缓存了,如果有就用缓存里的数据,没有的话再重新请求。
//先获取保存的文件的位置
NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *fileName = [doc stringByAppendingPathComponent:@"fmdb.sqlite"];
//判断是否存在这个文件
BOOL isExit = [[NSFileManager defaultManager]fileExistsAtPath:fileName];
if (!isExit) {
//不存在的话,重新从网上请求数据
[self requestDatas];
}else
{
//存在的话,先创建数据库
[self creatFmdb];
//获取数据库里的信息
[self readDataFromFmdb];
}
}
//网络请求
- (void)requestDatas
{
NSString *url = @"****************************************************";
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:url parameters:nil success:^(AFHTTPRequestOperation * _Nonnull operation, id _Nonnull responseObject) {
//NSLog(@"%@",responseObject);
NSArray *infoArr = responseObject[@"data"];
for (NSDictionary *dict in infoArr) {
//取出请求下来的数据保存到可变数组_datas里
[_datas addObject:dict];
}
//创建数据库
[self creatFmdb];
//插入数据
[self insertDataToFmdb:_datas];
//刷新UI界面
[_tableview reloadData];
} failure:^(AFHTTPRequestOperation * _Nonnull operation, NSError * _Nonnull error) {
NSLog(@"%@",error);
}];
}
//创建数据库缓存
- (void)creatFmdb
{
//获取数据库文件的路径
NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString * fileName = [doc stringByAppendingPathComponent:@"fmdb.sqlite"];
//创建数据库
FMDatabase *db = [FMDatabase databaseWithPath:fileName];
//打开数据库
[db open];
if ([db open]) {
//创表
BOOL table = [db executeUpdate:@"CREATE TABLE IF NOT EXISTS sstable (id integer PRIMARY KEY ,image text NOT NULL,name text NOT NULL ) ;"];
if (table) {
NSLog(@"创表成功");
}else
{
NSLog(@"创表失败");
}
}
_db = db; //_db为创建的FMDatabase类型的全局变量。
}
//插入数据
- (void)insertDataToFmdb:(NSArray *)datas
{
//首先打开数据库
[self.db open];
//插入数据
if ([self.db open]) {
for (int i = 0; i < datas.count; i++) {
[self.db executeUpdate:@"INSERT INTO sstable (image,name) VALUES (?, ?);",datas[i][@"logo"],datas[i][@"name"]];
}
}
[self.db close];
}
//读取数据
- (void)readDataFromFmdb
{
//获取数据库文件的路径
NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSLog(@"doc:----%@",doc);
_fileName = [doc stringByAppendingPathComponent:@"fmdb.sqlite"];
//获取数据库
FMDatabase *db = [FMDatabase databaseWithPath:_fileName];
//首先打开数据库
[db open];
if ([db open]) {
//读取数据
FMResultSet *result = [self.db executeQuery:@"SELECT * FROM sstable"];
while ([result next]) {
NSMutableDictionary *dict = [[NSMutableDictionary alloc]initWithObjectsAndKeys:[result stringForColumn:@"image"],@"logo",[result stringForColumn:@"name"],@"name",nil];
[_datas addObject:dict];
}
}
[db close];
}
到此已经可以完成数据缓存了,除了上述把数据库、网络请求和界面搭建写在一个控制器里的方法,还可以把数据库操作单独拿出来写一个单例,这样子使用起来会更简单方便一些!