IOS数据持久化之归档NSKeyedArchiver, NSUserDefaults,writeToFile


 
    //2.文件读写
    //支持:NSString, NSArray , NSDictionay, NSData
     //注:集合(NSArray, NSDictionay)中得元素也必须是这四种类型, 才能够进行文件读写
     
     //string文件读写
    NSString *string = @"假如给我有索纳塔";
   
    //Document
    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    //指定文件路径 aaa.txt
    NSString *filePath = [docPath stringByAppendingPathComponent:@"aaa.txt"];
    NSLog(@"**%@", filePath);
    //写入文件
    //参数1:文件路径, 如果文件路径下没有此文件, 系统会自动创建一个文件.
    //参数2:是否使用辅助文件
    //参数3:编码格式
    //参数4:错误
    NSError *error = nil;
    BOOL result = [string writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:&error];
    if (result) {
        NSLog(@"写入成功");
    } else {
    
        NSLog(@"写入错误");
    }
    if (error) {
        NSLog(@"出现错误");
    }
    
    //取值操作,
    NSError  *error1 = nil;
    NSString *contenSring = [[NSString alloc] initWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&error1];
    if (error1) {
        NSLog(@"error:%@", error1);
    } else {
        NSLog(@"文件内容%@", contenSring);
    }
    [contenSring release];
    
    
    
    
    //NSArray的文件读写
    
    NSArray *array = @[@"123", @"abc", @"apm"];
    //写入操作, 格式XML
    //Library, test.txt
    //library路径
    NSString *libraryPath1 = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) firstObject];
    //文件路径
    NSString *textPath = [libraryPath1 stringByAppendingPathComponent:@"text.txt"];
    NSLog(@"%@", textPath);
    //写入
    BOOL result4 = [array writeToFile:textPath atomically:YES];
    //判断是否写入成功
    if (result4) {
        NSLog(@"写入成功");
    } else {
        NSLog(@"写入失败");
    }
    
    //取值操作
   
    NSArray *bbb = [[NSArray alloc] initWithContentsOfFile:textPath];
    NSLog(@"%@", bbb);
    [bbb release];
    
    
    
    
    
    //NSDictionary, 格式:XMl
    NSDictionary *dic = @{@"a": @"aaa", @"1": @"111", @"*" :@"**"};
    //Caches, dic.txt
    //Caches文件路径
    NSString *cachesPath1 = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)firstObject];
    //dic.txt路径
    NSString *dicPath = [cachesPath1 stringByAppendingPathComponent:@"dic.txt"];
    NSLog(@"%@", dicPath);
    //写入
    BOOL result3 = [dic writeToFile:dicPath atomically:YES];
    //判断写入是否成功
    if (result3) {
        NSLog(@"写入成功");
    } else {
        NSLog(@"写入shib");
    }
    //取值操作
    NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:dicPath];
    NSLog(@"%@", dict);
    [dict release];
    
    
    
    //NSData NSString *tmpPath = NSTemporaryDirectory();
    NSString *string2 = @"132456789";
    //字符串转data
     NSData *data = [string2 dataUsingEncoding:NSUTF8StringEncoding];
    //tmp路径
    //tmp data.txt
    NSString *tmpPath1 = NSTemporaryDirectory();
    //data.txt路径
     NSString *dataPath = [tmpPath1 stringByAppendingPathComponent:@"data.txt"];
    //写入
    BOOL result1 = [data writeToFile:dataPath atomically:YES];
    //判断是否写入成功
    if (result1) {
        NSLog(@"写入成功");
    } else {
        NSLog(@"写入失败");
    }
    
    //取值
    NSData *datat = [[NSData alloc] initWithContentsOfFile:dataPath];
    NSString *dataSting = [[NSString alloc] initWithData:datat encoding:NSUTF8StringEncoding];
     [datat release];
    NSLog(@"%@", dataSting);
    [dataSting release];
    

 1     //3.归档 / 反归档
 2     //归档的实质:把其他类型数据(比如:Person),先转化成NSData, 再写入文件
 3     //能进行归档的对象, 必须遵守<NSCoding>
 4     
 5     //归档
 6     Person *person = [[[Person alloc] init] autorelease];
 7     person.name = @"辉哥";
 8     person.age = @"18";
 9     person.gender = @"";
10     //NSLog(@"%@", person);
11     
12     
13     //可变data
14     NSMutableData *mData = [[NSMutableData alloc] initWithCapacity:0];
15     
16     //NSKeyedArchiver, 压缩工具, 继承于NSCoder,主要用于编码
17     NSKeyedArchiver *archiver= [[NSKeyedArchiver alloc] initForWritingWithMutableData:mData];
18     //把Person对象压到Data中
19     [archiver encodeObject:person forKey:@"girlFriend"];
20     //完成压缩
21     [archiver finishEncoding];
22     [archiver release];
23     NSLog(@"%@", mData);
24     
25     //主目录中, person.txt
26       NSString *homePatha = NSHomeDirectory();
27       NSString *mDataPath = [homePatha stringByAppendingPathComponent:@"person.txt"];
28     NSLog(@"%@", mDataPath);
29     BOOL result = [mData writeToFile:mDataPath atomically:YES];
30     if (result) {
31         NSLog(@"写入成功");
32     } else {
33         NSLog(@"写入失败");
34     }
35     [mData release];
36 
37     //反归档
38     NSData *contentData = [[NSData alloc] initWithContentsOfFile:mDataPath];
39     //NSKeyedUnarchiver解压工具, 继承于NSCoder
40     NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:contentData];
41     [contentData release];
42     //通过key找到person
43    Person *contentPerson = [unarchiver decodeObjectForKey:@"girlFriend"];
44     NSLog(@"gd%@", contentPerson);
45     [unarchiver release];
46     

 

  1   
  2     //数据持久化:数据永久的保存
  3     //数据持久化的实质:把数据写入文件, 再把文件存到硬盘
  4     //IOS沙盒机制:IOS系统为每个app生成一个文件夹(沙盒), 这个文件夹只允许当前的APP访问
  5     //沙盒的主目录
  6     //沙盒主目录的文件夹名字由 十六进制数 和 - 组成, 保证沙盒安全性
  7     //NSHomeDirectory()
  8     NSString *homePath = NSHomeDirectory();
  9     NSLog(@"%@", homePath);
 10     
 11     //Documents文件
 12     //存放着一些比较重要的用户信息, 比如游戏的存档
 13     //Documents中得文件会被备份 或者 存入iCloud 中, 所以存到documents中得文件不能过大, 如果过大, 会在应用审核过程中遭到拒审
 14     //参数1:文件夹名称
 15     //参数2:搜素域 优先级user>local>network>system
 16     //参数3:相对路径或者绝对路径, yes 是绝对, no是相对
 17     //因为相同文件名的文件可能有多个, 所以返回的是一个数组
 18     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
 19     //NSLog(@"%@", paths);
 20     
 21     NSString *docmentsPath = [paths firstObject];
 22     //NSLog(@"%@", docmentsPath);
 23     
 24     //Library,资源库 存放一些不太重要, 相对比较大得文件
 25     NSString *libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) firstObject];
 26     //NSLog(@"libraryPath:%@", libraryPath);
 27     //Library/Caches, 缓存, 网页缓存, 图片缓存, 应用中得"清理缓存"功能, 就是清理这个文件夹下得内容
 28     NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
 29     //NSLog(@"%@", cachesPath);
 30     //LanunchImages, 由LaunchScreen.xib生成的启动图片
 31     
 32     
 33     //Library/Preferences, 偏好设置, 存放用户对这个应用的设置或配置
 34     //注:路径找不到,通过NSUserDefaults访问
 35     
 36     
 37     //tmp, 临时文件, 存放下载的压缩包, 解压过后删除
 38     NSString *tmpPath = NSTemporaryDirectory();
 39     NSLog(@"%@", tmpPath);
 40     
 41     //  *.app, 包,用右键,显示包内容, 查看里面存放的文件
 42     //IOS8.0以后, *.app单独存放到一个文件内
 43     //  *.app中这个文件,只能够访问,不能够修改(写入)
 44     NSString *bundlePath = [[NSBundle mainBundle] bundlePath];
 45     NSLog(@"***%@", bundlePath);
 46     
 47     
 48     //NSFileManager文件管理工具, 主要用于添加, 移动, 修改, 拷贝文件, 继承于NSObject
 49     //文件管理工具是个单例
 50     NSFileManager *fm = [NSFileManager defaultManager];
 51     //文件路径
 52     NSString *hPath = [[fm URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] firstObject];
 53     NSLog(@"hPath:%@", hPath);
 54     
 55     //创建文件夹,
 56     //在主目录中创建images文件夹
 57     NSString *mainPath = NSHomeDirectory();
 58     NSString *directoryPath = [mainPath stringByAppendingPathComponent:@"images"];
 59     NSLog(@"%@", directoryPath);
 60     
 61     NSError *error = nil;
 62     //attributes设置文件夹的属性,读写,隐藏等等
 63     //NSDictionary *attributes = @{NSFileAppendOnly: @YES};
 64     BOOL result = [fm createDirectoryAtPath:directoryPath withIntermediateDirectories:YES attributes:nil error:&error];
 65     if (result) {
 66         NSLog(@"创建成功");
 67     } else {
 68     
 69         NSLog(@"创建失败");
 70     }
 71     
 72     //创建文件
 73     //在Images文件夹中创建image.png
 74     NSString *imagePath = [directoryPath stringByAppendingPathComponent:@"image.png"];
 75     NSLog(@"%@", imagePath);
 76     
 77     //找图片
 78     NSString *meinvPath = [[NSBundle mainBundle] pathForResource:@"美女7" ofType:@"png"];
 79     NSData *imageData = [NSData dataWithContentsOfFile:meinvPath];
 80     
 81     //创建图片
 82     BOOL result2 = [fm createFileAtPath:imagePath contents:imageData attributes:nil];
 83     if (result2) {
 84         NSLog(@"创建成功");
 85     } else {
 86         NSLog(@"创建失败");
 87     }
 88     
 89     //判断文件是否存在
 90     if ([fm fileExistsAtPath:imagePath]) {
 91         NSLog(@"存在");
 92         //删除
 93         NSError *error = nil;
 94        BOOL result = [fm removeItemAtPath:imagePath error:&error];
 95         if (result) {
 96             NSLog(@"删除成功");
 97         } else {
 98             NSLog(@"删除失败%@", error);
 99         }
100     }
101     
102     NSString *path = NSHomeDirectory();
103     NSString *filePath = [path stringByAppendingPathComponent:@"aaa.txt"];
104     NSLog(@"1*%@", filePath);
105     NSString *filePath1 =[path stringByAppendingString:@".aaa.txt"];
106     NSLog(@"2*%@", filePath1);
107     NSString *filePath2 = [path stringByAppendingFormat:@"/baa.txt"];
108     NSLog(@"3*%@", filePath2);
109     NSString *filePath3 = [path stringByAppendingPathExtension:@"caaa.txt"];
110     NSLog(@"4*%@", filePath3);
111     
112     
113     
114     
115     
116 
117     //数据持久化的方式
118    //1. NSUserDefaults, 继承于NSObject, 单例设计模式, 内部存值用的KVC
119     NSInteger money = 100000;
120     money -= 99999;
121     
122     //存数据, 存放到PreFerences文件夹内的*.plist文件中, 以字典的形式存储
123     NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
124     
125     [userDefaults setInteger:1 forKey:@"myMoney"];
126     //同步操作, 让存入的数据写入文件
127     [userDefaults synchronize];
128     
129     
130     //取数据, key和存数据的key保持一致
131     NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
132     NSInteger myMoney = [user integerForKey:@"myMoney"];
133     NSLog(@"%ld", myMoney);
134     
135     
136     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
137     NSInteger mmoney = [defaults integerForKey:@"myLifeMoney"];
138     if (mmoney <= 10) {
139         NSLog(@"不能花了");
140     } else {
141         NSLog(@"花了10, 吃了俩");
142         mmoney -= 10;
143         [defaults setInteger:mmoney forKey:@"myLifeMoney"];
144         [defaults synchronize];
145     }
146  
147     
148     //NSUserDefaults, 支持的数据类型:array, dictionary, string, data, date, number, bool
149     //NSUserDefaults, 一般存一些数值, 不存大量的数据
150     //是不是第一次启动
151     NSUserDefaults *userDefault1 = [NSUserDefaults standardUserDefaults];
152     BOOL isFirst = [userDefault1 boolForKey:@"isFirst"];
153     if (isFirst == NO) {
154         NSLog(@"第一次启动");
155         [userDefault1 setBool:YES forKey:@"isFirst"];
156     } else {
157         NSLog(@"不是第一次启动");
158     }

Person.h 中实现NSCoding协议   

#import <Foundation/Foundation.h>

@interface Person : NSObject<NSCoding>

@property (nonatomic , retain) NSString *name, *age, *gender;

@end

Person.m 中实现的方法

 1 #import "Person.h"
 2 
 3 @implementation Person
 4 - (void)dealloc
 5 {
 6     [_age release];
 7     [_name release];
 8     [_gender release];
 9     [super dealloc];
10     
11 }
12 
13 - (NSString *)description
14 {
15     return [NSString stringWithFormat:@"name:%@, age:%@, gender:%@", _name, _age, _gender];
16 }
17 
18 #pragma mark - NSCoding
19 - (void)encodeWithCoder:(NSCoder *)aCoder {
20     //编码
21     [aCoder encodeObject:self.name forKey:@"NAME"];
22     [aCoder encodeObject:self.age forKey:@"AGE"];
23     [aCoder encodeObject:self.gender forKey:@"GENDER"];
24 }
25 - (id)initWithCoder:(NSCoder *)aDecoder {
26     self = [super init];
27     if (self) {
28         //解码
29         self.name = [aDecoder decodeObjectForKey:@"NAME"];
30         self.age = [aDecoder decodeObjectForKey:@"AGE"];
31         self.gender = [aDecoder decodeObjectForKey:@"GENDER"];
32     }
33     return self;
34 }
35 
36 
37 @end

 

@interface Person : NSObject<NSCoding>


 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。