断断续续重写了原来项目的代码,新的应用可以添加多个城市,同时用SQLite实现本地缓存的功能。
在重写的项目中,我没有使用Storyboard,而是使用代码来构建主页面。
要实现添加多个页面,同时每个页面还要可以下拉刷新的功能,我目前想到的就是用一个scrollview在后面充当垫板,每个城市页面再附在上面。用拖控件的方式的话,多个scrollview叠在一起,后面的控件就无法交互了。也许是我对控件理解不够,总是无法解决,所以最后决定用代码写主界面,xib构建单独的城市页面。
在实现添加页面功能的过程中,印象最深的就是viewWithTag,添加一个tag就可以随意的取出之前的页面。
在原来的项目中也有本地缓存的功能,不过那个项目只有一个页面,所以直接使用写文件的方式存储JSON数据。在现在的项目中,有了多个页面需要缓存,单纯的写文件明显不够用,查了网上的资料后决定使用SQLite来存储数据。
使用SQLite的过程中,最主要的问题就是如何把二进制文件存入数据库。现在有两种方法,一是存文件的路径,二是直接写入。存文件路径不会影响数据库效率,但是我觉得有点繁琐,每次查询天气得到的数据还得命名写入沙盒。直接写入会影响效率,但是天气的JSON数据很小,我觉得影响不大。
存入JSON需要在表中建立blob字段,JSON转换为NSData,insert语句中对应位置用‘?’代理,然后使用bind语句绑定,例如:
1 NSData *data = [NSJSONSerialization dataWithJSONObject:weatherdic options:NSJSONWritingPrettyPrinted error:nil]; 2 NSString *sql = [NSString stringWithFormat:@"INSERT INTO t_weather VALUES (%ld,?);",cityid]; 3 sqlite3_stmt *savestmt;
//准备语句 4 sqlite3_prepare_v2(_db, sql.UTF8String, -1, &savestmt, NULL);
//绑定数据 5 sqlite3_bind_blob(savestmt, 1, [data bytes], (int)[data length], NULL);
//执行语句 6 sqlite3_step(savestmt);
每次打开应用时,会首先从数据库读取天气数据构建页面。现在准备加上检测网络状态,自动刷新和定位的功能。