美文网首页
【iOS】数据持久化

【iOS】数据持久化

作者: cod_mm | 来源:发表于2015-11-03 16:40 被阅读0次

    在iOS开发中我们常常需要做数据存储,这里主要说的时以下几种本地数据存储的方式。

    NSUserDefaults
    属性列表: 集合对象可以读写到属性列表中
    对象归档:对象可以保存到归档文件中
    SQLite数据库:开源嵌入式关系型数据库
    FMDB:

    NSUserDefaults

    NSUserDefaults适合存储轻量级的本地数据,比如用户的信息,登录状态等数据。
    NSUserDefaults支持的数据格式有:NSNumber(Integer、Float、Double),NSString,NSDate,NSArray,NSDictionary,BOOL类型

    // 存
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:@"iOS开发者" forKey:@"name"];
    [defaults synchronize];
    
    // 取
    NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
    NSString *name = [userDefault objectForKey:@"name"];
    

    属性列表

    属性列表文件是一种XML文件,Foundation框架中的数组和字典等都可以于属性列表文件相互转换。

    • NSArray类常用读写属性列表文件的方法:
      +arrayWithContentsOfFile:类级构造方法,用于从属性列表文件中读取数据,创建NSArray对象。
      -initWithContentsOfFile:实例构造方法,用于从属性列表文件中读取数据,创建NSArray对象。
      -writeToFile:atomically:该方法把NSArray对象写入到属性列表文件中,第一个参数是文件名,第二个参数为是否使用辅助文件,如果为YES,则先写入到一个辅助文件,然后辅助文件再重新命名为目标文件,如果为NO,则直接写入到目标文件。
     // 存储路径 
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"array.plist"];
    
    // 写数据
    NSArray *array = @[@"test1", @"test2", @"test3"];
    [array writeToFile:path atomically:YES];
    
    // 读数据
    NSArray *getArray = [[NSArray alloc] initWithContentsOfFile:path];
    NSLog(@"---读取的数据---%@", getArray); 
    
    • NSDictionary类常用读写属性列表文件的方法:
      +dictionaryWithContentsOfFile:类级构造方法,用于从属性列表文件中读取数据,创建NSDictionary对象。
      -initWithContentsOfFile:实例构造方法,用于从属性列表文件中读取数据,创建NSDictionary对象。
      -writeToFile:atomically:该方法将NSDictionary对象写入到属性列表文件中。
    // 存储路径
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"dict.plist"];
    
    // 写数据
    NSDictionary *dict = @{@"a":@"test1", @"b":@"test2", @"c":@"test3"};
    [dict writeToFile:path atomically:YES];
    
    // 读数据
    NSDictionary *getDict = [[NSDictionary alloc] initWithContentsOfFile:path];
    NSLog(@"---读取的数据---%@", getDict);
    

    对象归档

    对象归档是一种序列化方式。存储即将归档对象序列化位一个文件进行持久化,读取是通过反归档将持久化的数据恢复到对象中。
    注意:可归档的对象必须实现NSCoding协议

    • 对 Foundation 库中对象进行归档(这里不再介绍)
    • 自定义对象进行归档 (需要实现归档协议、NSCoding)

    自定义类实现NSCoding协议

      @interface Person : NSObject <NSCoding>
      @property(nonatomic, copy) NSString *name;
      @property(nonatomic, copy) NSString *sex;
      @property(nonatomic, assign) NSInteger age;
      @end 
    

      @implementation Person
      - (void)encodeWithCoder:(NSCoder *)aCoder {
          [aCoder encodeObject:self.name forKey:@"name"];
          [aCoder encodeObject:self.sex forKey:@"sex"];
          [aCoder encodeInteger:self.age forKey:@"age"];
      }
      - (instancetype)initWithCoder:(NSCoder *)aDecoder {
          if (!(self = [super init])) {
              return nil;
          }
          self.name = [aDecoder decodeObjectForKey:@"name"];
          self.sex = [aDecoder decodeObjectForKey:@"sex"];
          self.age = [aDecoder decodeIntegerForKey:@"age"];
          return self;
      }
      @end
    

    归档/解档

    Person *person = [[Person alloc] init];
    person.name = @"iOS开发着";
    person.sex = @"男";
    person.age = 1000;    
    NSString *file = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"person.data"];
    
    // 归档
    [NSKeyedArchiver archiveRootObject:person toFile:file];
    
    // 解档
    Person *per = [NSKeyedUnarchiver unarchiveObjectWithFile:file];
    if (per) {
        NSLog(@"-------解归档---name----: %@", per.name);
        NSLog(@"-------解归档---sex----: %@", per.sex);
        NSLog(@"-------解归档---age----: %ld", per.age);
    }
    

    SQLite3

    FMDB

    相关文章

      网友评论

          本文标题:【iOS】数据持久化

          本文链接:https://www.haomeiwen.com/subject/mdvqhttx.html