iOS数据持久化之---属性列表

Posted Running2snail

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS数据持久化之---属性列表相关的知识,希望对你有一定的参考价值。

 属性列表(plist)

  ios提供了一种plist格式的文件(属性列表)用于存储轻量级的数据,并且只能保存NSDictionary、NSArray、NSString、NSNumber、Boolean、NSData、NSDate 类型的数据。将这些类型的数据保存为plist格式文件,该格式保存的数据可以直接使用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;
 

   // 存储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;

     }

 

 (二)、手动添加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文件的读写效率比较高,由于他的读写需要将所有的数据取出再全部保存,所以只适合小数据。

以上是关于iOS数据持久化之---属性列表的主要内容,如果未能解决你的问题,请参考以下文章

本篇对IOS中常用的5种数据持久化方法进行简单对比总结

IOS数据持久化之归档NSKeyedArchiver

李洪强iOS开发之数据存储

关于数据持久化

IOS中的属性列表----Property List

回栈事务后如何持久化分片数据?