IOS开发学习分享(三)——数据持久化(读写plist)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/madonghyu/article/details/81157036

今天由于想实现用户数据在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]就可以了。


猜你喜欢

转载自blog.csdn.net/madonghyu/article/details/81157036