iOS 的几种数据持久化方案

引用:http://www.cocoachina.com/ios/20150720/12610.html

  

    //************************沙盒************************

    

    //应用程序包,里面存放的是应用程序的源文件,包括资源文件和可执行文件

    NSString *path=[[NSBundle mainBundle]bundlePath];

    NSLog(@"%@",path);

    

    //Documents 最常用的目录,iTunes同步应用时会同步此文件夹中的内容,适合存储重要的数据

    

    NSString *document_path=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;

    NSLog(@"%@",document_path);

    

    //Library/Caches:iTunes 不会同步此文件夹,适合存储体积大,不需要备份的非重要数据

    NSString *library_path=NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;

    NSLog(@"%@",library_path);

    //library/Preferences:iTunes同步应用时会同步此文件夹中的内容,通常保存应用的设置信息


    //tmp:iTunes不会同步次文件夹,系统可能在应用没有运行时就删除该目录下的文件,所以此目录适合保存应用中的一些临时文件,用完就删除

    NSString *tmp_path=NSTemporaryDirectory();

    NSLog(@"%@",tmp_path);

    

    //**********************plist******************

    

    //plist文件 是将某些特定的类,通过XML文件的方式保存在目录中

    //可以被序列化的类型只有如下几种:NSArray,NSMutableArray,NSDictionary,NSMutableDictionary,NSData,NSMutableData,NSString,NSMutableString,NSNumber,NSDate

    //1.获得文件路径

    NSString *plist_path=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;

    NSString *fileName=[plist_path stringByAppendingString:@"alta.plist"];

    //2.存储

    NSArray *array=@[@"123",@"456",@"789"];

    [array writeToFile:fileName atomically:YES];

    //3.读取

    NSArray *result=[NSArray arrayWithContentsOfFile:fileName];

    NSLog(@"%@",result);

    

    /*只有以上列出的类型才能使用plist文件存储。

    存储时使用writeToFile: atomically:方法。 其中atomically表示是否需要先写入一个辅助文件,再把辅助文件拷贝到目标文件地址。这是更安全的写入文件方法,一般都写YES

    读取时使用arrayWithContentsOfFile:方法。*/

    

    //*******************Preference*****************

    //1.使用方法

    //1.获得NSUserDefaults文件

    NSUserDefaults *userDefaults=[NSUserDefaults standardUserDefaults];

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

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

    [userDefaults setObject:@"girl" forKey:@"sex"];

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

    //立即同步

    [userDefaults synchronize];

    //3.读取文件

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

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

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


    NSLog(@"her name is %@,is a %@,age %@",name,sex,@(age));

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

     如果没有调用synchronize方法,系统会根据I/O情况不定时刻地保存到文件中。所以如果需要立即写入文件的就必须调用synchronize方法。

     偏好设置会将所有数据保存到同一个文件中。即preference目录下的一个以此应用包名来命名的plist文件。*/

    

    //*****************NSKeyedArchiver************

    //归档在IOS中是另一种形式化的序列化

    

    NSCoding协议声明了两个方法,这两个方法都是必须实现的。一个用来说明如何将对象编码到归档中,另一个说明如何进行解档来获取一个新对象。

    

    遵循协议和设置属性

   

    //1.遵循NSCoding协议

    @interface Person : NSObject   //2.设置属性

    @property (strong, nonatomic) UIImage *avatar;

    @property (copy, nonatomic) NSString *name;

    @property (assign, nonatomic) NSInteger age;

    @end

    实现协议方法

   

    //解档

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

        if ([super init]) {

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

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

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

        }

        return self;

    }

    //归档

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

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

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

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

    }

    特别注意

    如果需要归档的类是某个自定义类的子类时,就需要在归档和解档之前先实现父类的归档和解档方法。即 [super encodeWithCoder:aCoder] [super initWithCoder:aDecoder] 方法;

    

    2.使用

    

    需要把对象归档是调用NSKeyedArchiver的工厂方法 archiveRootObject: toFile: 方法。

    


    NSString *file = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"person.data"];

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

    person.avatar = self.avatarView.image;

    person.name = self.nameField.text;

    person.age = [self.ageField.text integerValue];

    [NSKeyedArchiver archiveRootObject:person toFile:file];

    需要从文件中解档对象就调用NSKeyedUnarchiver的一个工厂方法 unarchiveObjectWithFile: 即可。

    

  

    NSString *file = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"person.data"];

    Person *person = [NSKeyedUnarchiver unarchiveObjectWithFile:file];

    if (person) {

        self.avatarView.image = person.avatar;

        self.nameField.text = person.name;

        self.ageField.text = [NSString stringWithFormat:@"%ld", person.age];

    }

    3.注意

    

    必须遵循并实现NSCoding协议

    保存文件的扩展名可以任意指定

    继承时必须先调用父类的归档解档方法


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值