【iOS】数据持久化

在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 
  @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】数据持久化)