zoukankan      html  css  js  c++  java
  • iOS应用数据存储的常用方式

    iOS应用 数据存储的常用方式

    • XML属性列表 plist
    • Preference 偏好设置
    • NSKeyedArchiver 归档
    • Core Data
    • SQLite3

    应用沙盒:

    Layer:                        应用程序包(通常以应用程序名作为应用程序包名),包含所有资源文件和可执行文件

    Documents:               保存应用运行时生成的需要持久化的数据,iTunes同步数据是会备份该目录

    temp:                        保存应用运行时所需要的临时文件,应用没有运行时系统可能会清除该目录下的文件,iTunes同步设备时不会备份该目录

    Library:/Caches:         保存应用运行时生成的需要持久化的数据(一般都是些存储体积大且不需要备份的非重要数据),iTunes同步设备时不会备份该目录

    Library:/Preferences:  保存应用的所有偏好设置, iOS的Settings(设置)。应用会在该目录下查找应用的设置信息,iTunes同步设备时不会备份该目录

    plist文件读写

    //获取沙盒路径:

    NSString *homeDir = NSHomeDirectory();

    //获取temp路径:

    NSString *tempDir = NSTemporaryDirectory(); 

    //搜索目录(通过例子:将数字dataArr放入Documents路径下,然后读取):

    NSArray *dicArr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    //NSDocumentDirectory    搜索的目录名称(参数的值:NSDocumentDirectory 表示搜索的目录是Documents; NSCatchesDirectory: 表示搜索Library:/Caches; 

    //NSUserDomainMask   搜索范围

    //YES 是否展开路径

    NSString *filePath = dicArr[0];

    NSString *finalPath = [filePath stringByAppendingPathComponent:@"abc.plist"];

    NSArray *dataArr = @[@"1", @"sbd", @"sk34"];

    //将数组写入路径finalPath下的abc.plist文件下

    [dataArr writeToFile:finalPath atomically: YES];

    //从该路径下读取数组

    NSArray *strArr = [NSArray arrayWithContentsOfFile: finalPath];

    NSL(@"%@", strArr);

    偏好设置 (Library:/Preferences)

    偏好设置: 可以用来保存用户名, 密码,App的设置参数等。最终还是以.plist文件保存的

    每个应用都有一个NSUserDefaults实例, 通过它可以存取偏好设置

    //将数据存入偏好设置

    //注: 因为没有指定路径和名称,偏好设置会默认将项目名作为偏好设置保存文件的文件名,保存在默认路径App的Library/Preference中, 且后缀名为.plist

    -(IBAction)save {

      //偏好设置

      NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

      //根据一个key设置一个值

      [userDefaults setObject:@"sksk" forKey:@"name"];

      [userDefaults setinteger:10 forKey:@"age"];

      //但是偏好设置在设置好键值对后不会立即保存,如果需要立刻保存需要添加下面语句

      [userDefaults synchronize];

    }

    //从偏好设置取出数据

    -(IBAction)read {

      //偏好设置

      NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

      //根据一个key获取对应的值

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

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

      

      NSLot(@"%@, %ld", name, age);

    }

    归档(NSKeyedArchiver)

    偏好设置, plist都不能直接保存自定义的对象, 归档是专门用来保存自定义对象的。

    //自定义一个Person类对象

    //1. 在Person.h中遵守<NSCoding>协议

    //2. Person.m中实现下面两个协议方法(第一个用来归档,第二个用来解档)

    //描述需要归档的属性用于保存数据

    - (void)encodeWithCoder:(NSCoder *)aCoder {

      [aCoder encodeObject:self.name forKey:@"name"];

      [aCoder encodeInt32: self.age forKey: @"age"];

    }

    //告诉当前对象需要从文件中读取哪些数据

    - (instancetype)initWithCoder: (NSCoder *)aDecoder {

      //这里[super init]而没有使用[super initWithCoder:]是因为Person的父类没有遵守<NSCoding>协议

      if (self = [super init] {

        self.name = [aDecoder decodeObjectForKey: @"name"];

        self.age = [aDecoder decodeInt32ForKey: @"age"];

      }

      return self;

    }

    Person *p = [[Person alloc] init];

    p.name = @"xiaoming";

    p.age = 10;

    //3. 归档将数据归档

    NSString *filePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);

    NSString *filePathName = [filePath stringByAppendingPathComponent:@"person.data"];

    [NSKedArchiver archiveRootObject: p toFile: filePathName];

    //4. 从归档中取出数据

    NSString *filePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);

    NSString *filePathName = [filePath stringByAppendingPathComponent:@"person.data"];

    [NSKedUnarchiver unarchiveObjectWithFile: filePathName];

    //注: 如果有自定义对象 (比如Dog对象) 作为Person的属性, 那么Person的属性Dog对象的类中也要遵守协议并实现那两个方法(encodeWithCoder, initWithCoder)

    initWithCoder 当一个类解析一个文件时就会调用这个方法

  • 相关阅读:
    给一个二维数组随机赋值
    sql server use WAITFOR DELAY to wait some milliseconds
    sql server print time with milliseconds
    UE4 LeapMotion 获取手掌朝向
    Unity打包Android出现Failed to find Build Tools revision
    UE4中Yaw,Roll,Pitch分别对应什么轴?
    Unity 遍历场景所有物体(包括隐藏及被禁用的物体)
    C#-Linq扩展方法DistinctBy
    Unity编辑器扩展--Scene Manager
    Unity查找功能编辑器扩展Searcher
  • 原文地址:https://www.cnblogs.com/skjr/p/5609319.html
Copyright © 2011-2022 走看看