今天由于想实现用户数据在app里面的保存,由于觉得数据库太麻烦,发现IOS有plist这一个简单的文件储存方式,一开始以为挺简单的,结果还是发现有许多的坑。。。
真机上亲测有效(个人体会,plist适用于存储单类别的数据,像是用户的个人信息1以字典形式存在user.plist,而下载的记录用列表形式存在download.plist等,一开始博主以为plist可以存多种数据。。。)
首先是plist文件路径的获取,网上有许多的教程,一开始我以为要先创建plist文件的,要自己定义路径的说,结果发现可以直接通过函数获取,。,
NSArray *pathArr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *path = [pathArr objectAtIndex:0];
//得到完整的文件路径名
NSString *plistPath = [path stringByAppendingPathComponent:@"User.plist"];
接下来就是看你要用NSArray还是NSDictionary了,两者都差不多,但是这里也有一个注意点是要用NSMutableDictionary
,可变长度的数组或字典。。。
下面以字典为例子
NSMutableDictionary * plistDictionary =nil;
//判断路径是否存在,不存在就初始化
if (![[NSMutableDictionary alloc]initWithContentsOfFile:plistPath]) {
//创建一个根容器为数组的plist文件
plistDictionary = [NSMutableDictionary dictionary];
//写入文件
[plistDictionary writeToFile:plistPath atomically:YES];
}else{
plistDictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath];
}
博主主要被坑到的地方是字典带有null的时候会写入失败。。。,一开始不清楚的时候一直以为是文件没有创建,无语。。。。。。。
下面贴一下自己实现的将复合字典的null替换成空值的代码,使用了类别实现(不得不说类别用来增加功能真的是超级方便)
.h文件
@interface NSDictionary (MyDictionary)
-(NSDictionary *)deleteAllNullValue;
@end
.m文件
@implementation NSDictionary (MyDictionary)
- (NSDictionary *)deleteAllNullValue{
NSMutableDictionary *mutableDic = [[NSMutableDictionary alloc] init];
for (NSString *keyStr in self.allKeys) {
if ([[self objectForKey:keyStr] isKindOfClass:[NSDictionary class]]){
[mutableDic setValue:[[self objectForKey:keyStr] deleteAllNullValue] forKey:keyStr];
continue;
}
if ([[self objectForKey:keyStr] isEqual:[NSNull null]]) {
[mutableDic setObject:@"" forKey:keyStr];
}
else{
[mutableDic setObject:[self objectForKey:keyStr] forKey:keyStr];
}
}
return mutableDic;
}
@end
最后只要导入上面自己定义的类,调用函数[@{@"user":} deleteAllNullValue]
就可以了。