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>

时间: 2024-10-12 03:10:41

IOS数据持久化之归档NSKeyedArchiver, NSUserDefaults,writeToFile的相关文章

IOS数据持久化之归档NSKeyedArchiver

IOS数据持久化的方式分为三种: 属性列表 (自定义的Property List .NSUserDefaults) 归档 (NSKeyedArchiver) 数据库 (SQLite.Core Data.第三方类库等) 下面主要来介绍一个归档NSKeyedArchiver. 归档(又名序列化),把对象转为字节码,以文件的形式存储到磁盘上:程序运行过程中或者当再次重写打开程序的时候,可以通过解归档(反序列化)还原这些对象. 归档方式: 对Foundation框架中对象进行归档 对自定义的内容进行归档

iOS开发笔记-swift实现iOS数据持久化之归档NSKeyedArchiver

IOS数据持久化的方式分为三种: 属性列表 (plist.NSUserDefaults) 归档 (NSKeyedArchiver) 数据库 (SQLite.Core Data.第三方类库等 归档(又名序列化),把对象转为字节码,以文件的形式存储到磁盘上:程序运行过程中或者当再次重写打开程序的时候,可以通过解归档(反序列化)还原这些对象.本文主要介绍swift实现iOS数据归档. 归档Foundation框架对象 func archiveData(){ var path: AnyObject=NS

iOS数据持久化(一、NSUserDefaults)

NSUserDefaults适合存储轻量级的本地数据,比如要保存一个登陆界面的数据,用户名.密码之类的,个人觉得使用NSUserDefaults是首选(需要加密的登录信息请略过).下次再登陆的时候就可以直接从NSUserDefaults里面读取上次登陆的信息咯. 因为如果使用自己建立的plist文件什么的,还得自己显示创建文件,读取文件,很麻烦,而是用NSUserDefaults则不用管这些东西,就像读字符串一样,直接读取就可以了. NSUserDefaults支持的数据格式有:NSNumber

iOS数据持久化---对象归档

归档:是对对象及其属性还有同其他对象间的关系进行编码,形成一个文档,该文档既可以保存于文件系统,也可以在进程或网络间传送. 归档过程把对象图保存为一种与架构无关的字节流,保持对象的标识以及对象间的关系. 能够归档的对象必须遵守NSCoding协议,实现以下方法: - (void)encodeWithCoder:(NSCoder *)aCoder; - (id)initWithCoder:(NSCoder *)aDecoder; 使用NSCoder对象进行编码与解码操作.NSCoder本身是抽象类

iOS数据持久化之二——归档与设计可存储化的数据模型基类

iOS数据持久化之二--归档与设计可存储化的数据模型基类 一.引言 在上一篇博客中,我们介绍了用plist文件进行数据持久化的方法.虽然简单易用,但随着开发的深入,你会发现,这种方式还是有很大的局限性.试想,如果我们可以将用户的登录返回信息模型,游戏中角色的属性信息模型进行直接的持久化存取,那是不是非常爽的事,幸运的是,我们可以通过归档,来设计一个这样的数据模型. 二.先来精通归档吧 归档也是iOS提供给开发者的一种数据存储的方式,事实上,几乎所有的数据类型都可以通过归档来进行存取.其存储与读取

iOS -数据持久化方式-以真实项目讲解

前面已经讲解了SQLite,FMDB以及CoreData的基本操作和代码讲解(CoreData也在不断学习中,上篇博客也会不断更新中).本篇我们将讲述在实际开发中,所使用的iOS数据持久化的方式以及怎么会使用到这些方式,都会以本人实际开发的场景为例,大约需要花10-15分钟,欢迎大家指正. 一.前言 和大家说一个真实故事,前年我去美图面试(当时的技术仅仅是UI和接口的实现,并不注重很多底层实现和很多概念的原理,换句话说,就是真正的码农),过了技术第一轮和第二轮(前两年的也就是问问技术点的实现),

iOS数据持久化存储

本文中的代码托管在github上:https://github.com/WindyShade/DataSaveMethods 相对复杂的App仅靠内存的数据肯定无法满足,数据写磁盘作持久化存储是几乎每个客户端软件都需要做的.简单如"是否第一次打开"的BOOL值,大到游戏的进度和状态等数据,都需要进行本地持久化存储.这些数据的存储本质上就是写磁盘存文件,原始一点可以用iOS本身支持有NSFileManager这样的API,或者干脆C语言fwrite/fread,Cocoa Touch本身

iOS数据持久化方式分析

iOS数据持久化的方式一般为:plist文件写入.对象归档.SQLite数据库.CoreData. plist文件写入.对象归档一般用于小的数据量. SQLite数据库.CoreData则用于大的数据量. SQLite是一款轻型的数据库,是一种关系型数据库管理系统,他的设计目的是嵌入式设备中使用. SQLite占用资源非常低,非常适合移动设备中使用,而且是开源免费的 SQLite的数据库操作其实和常规的数据库操作流程是一样的: 1.打开数据库 sqlite3_open() 2.准备SQL语句,采

IOS数据存储之归档(NSKeyedArchiver)/解档(NSKeyedUnarchiver)

前言: 前天学习了NSUserDefaults,我们知道NSUserDefaults不能保存自定义对象,所以我们今天来认识一下归档和解档.我们先来回顾一下JAVA是怎么实现保存一个自定义对象的!首先一个自定义对象必须实现Serializable接口,然后把一个对象序列化成二进制数据写入一个byte[]数据或者文件,反之则是从一个二进制数据或者文件中读取二进制数据反序列化成对象,所以我认为ios的归档解档其实就是类似JAVA序列化反序列化的过程,下面写个程序来尝试一下. 先测试下基础类型: //归