博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS数据持久化存储之属性列表
阅读量:6282 次
发布时间:2019-06-22

本文共 4448 字,大约阅读时间需要 14 分钟。

 属性列表(plist)

  iOS提供了一种plist格式的文件(属性列表)用于存储轻量级的数据,属性列表是一种XML格式的文件,拓展名为plist。如果对象是NSString、NSDictionary、NSArray、NSData、 NSNumber等类型,就可以使用writeToFile:atomically:⽅法 直接将对象写到属性列表文件中该格式保存的数据可以直接使用NSDictionary和NSArray读取 

(一)、使用NSUserDefault 实现持久化

     下面来看下 NSUserDefault 本地保存的位置,。Library/Preferences 这个目录下的 plist 文件就是其保存的目录。

      NSUserDefault 的用法,主要是保存和读取

      初始化一个 NSUserDefault

     + (NSUserDefaults *)standardUserDefaults;

     设置数据的方法

      - (void)setObject:(nullable id)value forKey:(NSString *)defaultName;    

      - (void)setInteger:(NSInteger)value forKey:(NSString *)defaultName;   

      - (void)setFloat:(float)value forKey:(NSString *)defaultName;

      - (void)setDouble:(double)value forKey:(NSString *)defaultName;

      - (void)setBool:(BOOL)value forKey:(NSString *)defaultName;

      - (void)setURL:(nullable NSURL *)url forKey:(NSString *)defaultName NS_AVAILABLE(10_6, 4_0);

     读取数据的方法:

      - (nullable id)objectForKey:(NSString *)defaultName; 

      - (nullable NSString *)stringForKey:(NSString *)defaultName;

      - (nullable NSArray *)arrayForKey:(NSString *)defaultName;

      - (nullable NSDictionary<NSString *, id> *)dictionaryForKey:(NSString *)defaultName;

      - (nullable NSData *)dataForKey:(NSString *)defaultName;

      - (nullable NSArray<NSString *> *)stringArrayForKey:(NSString *)defaultName;

      - (NSInteger)integerForKey:(NSString *)defaultName;

      - (float)floatForKey:(NSString *)defaultName;

      - (double)doubleForKey:(NSString *)defaultName;

      - (BOOL)boolForKey:(NSString *)defaultName;

      - (nullable NSURL *)URLForKey:(NSString *)defaultName NS_AVAILABLE(10_6, 4_0);

      删除数据的方法:

       - (void)removeObjectForKey:(NSString *)defaultName;

      保存数据:

     // 如果不手动调用,系统会自动保存,但时间不定

       - (BOOL)synchronize;    

    使用方法

    //1.获得NSUserDefaults文件

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

    //2.向文件中写入内容

    [userDefaults setObject:@"AAA" forKey:@"a"];

    [userDefaults setBool:YES forKey:@"sex"];

    [userDefaults setInteger:21 forKey:@"age"];

    //2.1立即同步

    [userDefaults synchronize];

    //3.读取文件

    NSString *name = [userDefaults objectForKey:@"a"];

    BOOL sex = [userDefaults boolForKey:@"sex"];

    NSInteger age = [userDefaults integerForKey:@"age"];

   // 存储id类型数据

     + (void)setValue:(id)value andKey:(NSString *)key

    {

        NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

        [userDefaults setObject:value forKey:key];

        [userDefaults synchronize];

    }

// 获取数据

    + (NSString *)getValueByKey:(NSString *)key

    {

        NSUserDefaults * settings = [NSUserDefaults standardUserDefaults];

        NSString *value = [settings objectForKey:key];

        return value;

     }

   注意:

      偏好设置是专门用来保存应用程序的配置信息的,一般不要在偏好设置中保存其他数据。

      如果没有调用synchronize方法,系统会根据I/O情况不定时刻地保存到文件中。所以如果需要立即写入文件的就必须调用synchronize方法。
      偏好设置会将所有数据保存到同一个文件中。即preference目录下的一个以此应用包名来命名的plist文件。

 

 (二)、手动添加plist文件

      新建文件-->Resource-->Property List

       输入图片说明

           

    plist文件的根类型只能是NSArray或NSDictionary

     输入图片说明

    输入图片说明

 

      将plist文件中的数据读入对应的根类型

    // 1、获取文件所在的路径,Resource:文件名称、Type:文件格式

    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"userInfos" ofType:@"plist"];

    // 2、从路径中获取对应格式的数据

    // 如果Root为NSArray,则使用数组保存

    NSArray *infos = [NSArray arrayWithContentsOfFile:filePath];

    NSLog(@"%@",infos);

    // 如果Root为NSDictionary,则使用字典保存

    NSDictionary *infoDic = [NSDictionary dictionaryWithContentsOfFile:filePath];

    NSLog(@"%@",infoDic);

 

 (三)、直接讲数据写入plist文件

      由于 NSUserDefault 本质上就是通过 plist 文件来实现属性的持久化。所以,我们可以通过自己创建一个 plist 文件来实现属性的持久化。

        NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);    NSString *docPath = [path objectAtIndex:0];    NSString *myFile = [docPath stringByAppendingPathComponent:@"test.plist"];    NSMutableDictionary *contentDic;    // 判断本地是否存在 plist 文件    if ([[NSFileManager defaultManager] fileExistsAtPath:myFile] == NO) {    NSFileManager* fm = [NSFileManager defaultManager];     // 创建一个文件    [fm createFileAtPath:myFile contents:nil attributes:nil];    contentDic = [[NSMutableDictionary alloc] init];    } else {     contentDic = [[NSMutableDictionary alloc] initWithContentsOfFile:myFile];    }     // 数据的读写操作    [contentDic setObject:@"1234" forKey:@"passWord"];    // 将修改都的数据保存到 plist 文件中    [contentDic writeToFile:myFile atomically:YES];

(四)、总结

    plist文件的读写效率比较高,由于他的读写需要将所有的数据取出再全部保存,所以只适合小数据。

转载于:https://www.cnblogs.com/496668219long/p/5627931.html

你可能感兴趣的文章
使用MDT部署Windows Server 2003 R2
查看>>
Redhat as5安装Mysql5.0.28
查看>>
通过TMG发布ActiveSync
查看>>
Web服务器的配置与管理(4) 配置访问权限和安全
查看>>
吉林出差所见、所闻、所感
查看>>
RHEL7修改root用户密码
查看>>
mysqldump导出 timestamp类型数据 时区偏差8小时
查看>>
我的友情链接
查看>>
中小型企业如ERP选型四大标准
查看>>
笔记——quota磁盘配额
查看>>
索引表批量数据装载
查看>>
@Value("#{}")与@Value("${}")的区别
查看>>
Zabbix邮件报警设置方法
查看>>
20145328 《信息安全系统设计基础》第6周学习总结
查看>>
C语言随笔_类型声明
查看>>
AIX或LINUX,通过华为存储V3上添加对应LUN组,分配存储资源
查看>>
监控mysql主从的脚本
查看>>
用phpmyadimn来连接管理多个数据库
查看>>
linux java 定时任务
查看>>
Linux守护进程(init.d和xinetd)
查看>>