iOS 的几种数据持久化方案

来源:互联网 发布:wampserver 配置域名 编辑:程序博客网 时间:2024/05/22 04:39

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

  

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

    

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

    NSString *path=[[NSBundlemainBundle]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"];

    [arraywriteToFile:fileName atomically:YES];

    //3.读取

   NSArray *result=[NSArrayarrayWithContentsOfFile:fileName];

   NSLog(@"%@",result);

    

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

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

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

    

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

    //1.使用方法

    //1.获得NSUserDefaults文件

    NSUserDefaults *userDefaults=[NSUserDefaultsstandardUserDefaults];

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

    [userDefaultssetObject:@"Alta"forKey:@"name"];

    [userDefaultssetObject:@"girl"forKey:@"sex"];

    [userDefaultssetInteger:23forKey:@"age"];

    //立即同步

    [userDefaultssynchronize];

    //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
原创粉丝点击