今天由於想實現用戶數據在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]
就可以了。