iOS编程经常有要存数据的需求,例如这次做的购物app,希望把用户放在购物车里的数据存起来,以便用户下次运行程序时还可以看到购物车保存的商品,保存数据的几种方式可以参考另一个博主的文章:
http://blog.csdn.net/tianyitianyi1/article/details/7713103
考虑到购物车的数据一般不多,而且想保存的是对象数据,权衡利弊,可以用写文件的方法保存
如下,在 applicationWillTerminate:(UIApplication *)application 方法保存数据到本地文件,文件名随意定义
其中_carGoodsList是存储购物车商品CartGoods对象的数组,
具体实现原理:先用PrintObject类把对象打印成NSString(字典格式的NSString),然后把NSString数据存在arrayyy数组里面,最后是把数组写到文件,这么麻烦是因为写到文件里面的arrayyy数组不能包含其他自定义的对象(麻烦!!)
//将购物车的商品数据保存在本地文件
_carGoodsList = [[[GlobalVariablessharedInstance]cartList] allValues];
NSData *jsonData = [NSDatanew];
NSMutableArray *arrayyy = [NSMutableArraynew];
for (CartGoods *goodsin _carGoodsList) {
jsonData = [PrintObjectgetJSON:goods options:NSJSONWritingPrettyPrintederror:nil];
NSString *tempStr = [[NSStringalloc] initWithData:jsonDataencoding:NSUTF8StringEncoding];
[arrayyyaddObject:tempStr];
}
NSString *docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES)lastObject];
NSString *path=[docPathstringByAppendingPathComponent:@"carGoodsList.en"];
[NSKeyedArchiverarchiveRootObject:arrayyy toFile:path];
//从本地加载购物车数据并初始化购物车数量
NSString *docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES)lastObject];
NSString *path=[docPathstringByAppendingPathComponent:@"carGoodsList.en"];
NSArray *tempArray =[NSKeyedUnarchiverunarchiveObjectWithFile:path];
for (NSString *dictStrin tempArray) {
NSError *error = nil;
NSDictionary *dict = [NSJSONSerializationJSONObjectWithData: [dictStr dataUsingEncoding:NSUTF8StringEncoding]
options: NSJSONReadingMutableContainers
error: &error];
if (error) {
DebugLog(@"解析失败!");
}else {
CartGoods *goods = [CartGoodsnew];
[goodssetDict:dict];
[mallmapAppaddCartGoods:goods];//购物车添加商品
}
}
//购物车数量提示
[[NSNotificationCenterdefaultCenter] postNotificationName:@"setBadge"object:@"3"];
反过程用到NSJSONSerialization把符合字典数据结构的Nsstring转换为NSDictionary数据。
-(void)updateDataCacheOfcarGoods:(CartGoods *) cartGoods {
//更新数据库数据
NSData *jsonData = [NSData new];
jsonData = [PrintObject getJSON:cartGoods options:NSJSONWritingPrettyPrinted error:nil];
NSString *jsondictStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
DB *db = [DB initMallmapDB:NO];
//删除旧的缓存
[db executeUpdate:@"delete from car_goods where goodsid =?", cartGoods.goods_id];
插入新的缓存
[db executeUpdate:@"insert into car_goods (goodsid, json_dictstr) values (?,?)", cartGoods.goods_id, jsondictStr];
[db close];
}
读取的过程也差不多:
-(void)loadCargoodsData{
//第二种方法是把数据库存储在数据库里面
DB *db = [DB initMallmapDB:NO];
FMResultSet *rset= [db executeQuery:@"select * from car_goods"];
NSError *error = nil;
NSDictionary *dict = [NSDictionary new];
while ([rset next]) {
NSString *goodsDictstr = [rset stringForColumn:@"json_dictstr"];
dict = [NSJSONSerialization JSONObjectWithData: [goodsDictstr dataUsingEncoding:NSUTF8StringEncoding]
options: NSJSONReadingMutableContainers
error: &error];
if (error) {
DebugLog(@"数据解析失败!");
}else {
CartGoods *goods = [CartGoods new];
[goods setDict:dict];
[mallmapApp addCartGoods:goods];
}
}
[db close];
}