IOS开发之——数据存取(57)

一 IOS数据存储常用方式

  • XML属性列表(plist)归档(Documents)

  • Preference(偏好设置)

  • NSKeyedArchiver归档(NSCoding)

  • SQLite3

  • Core Data

<!--more-->

二数据存储位置(应用沙盒)

  • Documents:保存应用运行时需要持久化的数据,iTunes同步设备时会备份该目录。例如:游戏应用可将游戏归档保存在该目录

  • tmp:保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。iTunes不会备份该目录

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

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

三 演示方式

  • 页面上有存储和读取两个按钮

  • 点击存储按钮时,写入数据

  • 点击读取按钮时,读取写入的数据

    IOS开发之——数据存取(57)

     

 

四 常见的数据存储

4.1 Documents归档

代码

    //保存按钮
    NSLog(@"%@",NSHomeDirectory());
    NSString *home=NSHomeDirectory();
    NSString *docPath=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES )[0];
    NSLog(@"%@",docPath);
    //文件路径
    NSString *filePath=[docPath stringByAppendingPathComponent:@"data.plist"];
    //只有具备了writeToFile的对象才能写入plist
    NSArray *[email protected][@1,@2,@"123"];
    [array writeToFile:filePath atomically:YES];
    
    //读取
    NSString *docPath=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES )[0];
    NSLog(@"%@",docPath);
    //文件路径
    NSString *filePath=[docPath stringByAppendingPathComponent:@"data.plist"];
    NSArray *data=[NSArray arrayWithContentsOfFile:filePath];
    NSLog(@"%@",data);

结果

  • 数据写入时

    IOS开发之——数据存取(57)

     

  • 读取Document存储的数据

    IOS开发之——数据存取(57)

     

4.2 偏好设置存储方式

存储位置

  • 偏好设置的存储路径是

    应用沙盒/Library/Preferences

代码

   //保存
   //[NSUserDefaults standardUserDefaults]可以直接操作偏好设置文件夹
    NSUserDefaults *defaults= [NSUserDefaults standardUserDefaults];
    //自动帮我们生成一个plist文件存放偏好设置的文件夹
    [defaults setObject:@"123" forKey:@"key"];
    //同步,把内存中的数据和硬盘同步
    [defaults synchronize];
    
    //读取
    NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
    NSLog(@"%@",[defaults objectForKey:@"key"]);

4.3 归档方式

Person存储对象

//Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject<NSSecureCoding>
@property (nonatomic,assign) int age;
@end
​
//Person.m
#import "Person.h"
@implementation Person
+ (BOOL)supportsSecureCoding
{
    return YES;
}
//在对象归档的时候调用
- (void)encodeWithCoder:(NSCoder *)coder
{
    [coder encodeInt:_age forKey:@"age"];
}
- (nullable instancetype)initWithCoder:(nonnull NSCoder *)coder {
    if ([super init])
    {
        self.age=[coder decodeIntForKey:@"age"];
    }
    return self;
}
- (NSString *)description
{
    return [NSString stringWithFormat:@"<%@ : %p, \"%d\">", [self class], self, _age];
}
@end

保存归档文件

   //创建Person对象
    Person *person=[Person new];
    person.age=18;
    //1.对需要保存的数据进行编码
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:person requiringSecureCoding:YES error:nil];
    //2将二进制数据保存到文件
    //创建文件
    NSString *docPath=NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
    //文件路径
    NSString *filePath=[docPath stringByAppendingPathComponent:@"person.archiver"];
    //创建文件
    [[NSFileManager defaultManager]createFileAtPath:filePath contents:nil attributes:nil];
    [data writeToFile:filePath atomically:YES];

解归档

   //解归档
    NSString *docPath=NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
      //文件路径
    NSString *filePath=[docPath stringByAppendingPathComponent:@"person.archiver"];
    //读取文件的内容
    NSData *data = [NSData dataWithContentsOfFile:filePath];
    //将二进制数据转换为对应的对象类型
    Person *person=[NSKeyedUnarchiver unarchivedObjectOfClass:[Person class] fromData:data error:nil];
    NSLog(@"%@",person);