ios中常用文件存取的方法有:

1、直接写文件的方式,可以存储的对象有NSString、NSArray、NSDictionary、NSData、NSNumber,数据全部存放在一个属性列表文件(*.plist文件)中。

2、NSUeserDefaults(偏好设置),用来存储应用设置信息,文件放在perference目录下。

3、归档操作(NSkeyedArchiver),不同于前面两种,它可以把自定义对象存放在文件中。

首先每个开发者都应该知道,对于一个应用来说,有唯一的沙盒与之对应,即每个应用不能跨沙盒操作文件。

一、获取沙盒路径,通过写文件的方式存储数据

直接来看代码:

  1. #import "ViewController.h"
  2. @interface ViewController ()
  3. @end
  4. @implementationViewController
  5. - (void)viewDidLoad
  6. {
  7. [super viewDidLoad];
  8. // Do any additional setup after loading the view,typically from a nib.
  9. [self mainOperation];
  10. }
  11. - (void)mainOperation
  12. {
  13. //获取沙盒中缓存文件夹路径
  14. //方法一
  15. //沙盒主目录
  16. NSString *homePath = NSHomeDirectory();
  17. //拼接路径
  18. NSString *path = [homePath stringByAppendingPathComponent:@"Library/Caches"];
  19.  
  20. //方法二
  21. //第一个参数目标文件夹目录(NSCachesDirectory查找缓存文件夹),第二个参数为查找目录的域(NSUserDomainMask为在用户目录下查找),第三个参数为结果中主目录是否展开,不展开则显示为~
  22. NSArray *arr = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
  23. //虽然该方法返回的是一个数组,但是由于一个目标文件夹只有一个目录,所以数组中只有一个元素。
  24. NSString *cachePath = [arr lastObject];
  25. //或者
  26. // NSString *cachePath = [arr objectAtIndex:0];
  27.  
  28. /**
  29. //获取沙盒中Document文件夹或者tmp文件夹路径都可使用上面两种方法
  30. //tmp文件夹路径可直接这样获取
  31. NSString *tmpPath = NSTemporaryDirectory();
  32. NSLog(@"%@",tmpPath);
  33. **/
  34.  
  35. //拼接路径(目标路径),这个时候如果目录下不存在这个lotheve.plist文件,这个目录实际上是不存在的。
  36. NSString *filePath = [cachePath stringByAppendingPathComponent:@"tese.plist"];
  37. NSLog(@"%@",filePath);
  38.  
  39. //创建数据
  40. NSDictionary *content = @{@"字典数据测试1":@"1",@"字典数据测试2":@"2",@"字典数据测试":@"3"};
  41. //将数据存到目标路径的文件中(这个时候如果该路径下文件不存在将会自动创建)
  42. //用writeToFile方法写文件会覆盖掉原来的内容
  43. [content writeToFile:filePath atomically:YES];
  44.  
  45. //读取数据(通过字典的方式读出文件中的内容)
  46. NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:filePath];
  47. NSLog(@"%@",dic);
  48. }
  49. @end

沙盒中Library/Caches目录下多了lotheve.plist文件

文件内容:

二、使用NSUeserDefaults(偏好设置)实现数据存储

每个应用都有一个NSUesrDefaults实例,通过它可以存储应用配置信息以及用户信息,比如保存用户名、密码、字体大小、是否自动登录等等。数据自动保存在沙盒的Libarary/ Preferences目录下。同样,该方法只能存取NSString、NSArray、NSDictionary、NSData、NSNumber类型的数据。

代码示例:

  1. #import "LXXViewController.h"
  2. @interface LXXViewController ()
  3. @end
  4. @implementationLXXViewController
  5. - (void)viewDidLoad
  6. {
  7. [super viewDidLoad];
  8. self.title = @"NSUserDefaults Demo";
  9. }
  10. //点击button保存数据
  11. - (IBAction)saveData:(id)sender {
  12. //获取NSUserDefaults对象
  13. NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
  14. //存数据,不需要设置路劲,NSUserDefaults将数据保存在preferences目录下
  15. [userDefaults setObject:@"Lotheve" forKey:@"name"];
  16. [userDefaults setObject:@"NSUserDefaults" forKey:@"demo"];
  17. //立刻保存(同步)数据(如果不写这句话,会在将来某个时间点自动将数据保存在preferences目录下)
  18. [userDefaults synchronize];
  19. NSLog(@"数据已保存");
  20. }
  21. //点击button读取数据
  22. - (IBAction)getData:(id)sender
  23. {
  24. //获取NSUserDefaults对象
  25. NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
  26. //读取数据
  27. NSString *name = [userDefaults objectForKey:@"name"];
  28. NSString *demo = [userDefaults objectForKey:@"demo"];
  29. //打印数据
  30. NSLog(@"name = %@ demo =%@",name,demo);
  31. }
  32. @end

Interface Building中设置了两个按钮:

点击“保存数据”后,查看沙盒中的Libarary/ Preferences目录:

数据以plist的格式写入磁盘中了。点开查看数据:

三、NSKeyedArchiver(归档操作)

使用归档操作存储数据的主要好处是,不同于前面两种方法只能存储几个常用的数据类型的数据,NSKeyedArchiver可以存储自定义的对象。

代码示例:

需要注意的是,需要保存的对象类一定要引用NSCoding协议,并且实现

  1. - (void)encodeWithCoder:(NSCoder *)aCoder
  2. - (id)initWithCoder:(NSCoder *)aDecoder

1、文件结构:

2、代码示例:

LXXViewController.m

  1. #import "LXXViewController.h"
  2. #import "TestPerson.h"
  3. @interface LXXViewController ()
  4. @property (nonatomic ,strong) TestPerson *p;
  5. @end
  6. @implementationLXXViewController
  7. - (void)viewDidLoad {
  8. [super viewDidLoad];
  9. }
  10. - (IBAction)saveData:(id)sender
  11. {
  12. //创建一个自定义类的实例
  13. _p = [[TestPerson alloc]init];
  14. _p.name = @"Lotheve";
  15. _p.age = 20;
  16. _p.sex = @"m";
  17. _p.familyMumbers = @[@"Father",@"Mather",@"Me"];
  18.  
  19. //获取文件路径
  20. NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
  21. //文件类型可以随便取,不一定要正确的格式
  22. NSString *targetPath = [docPath stringByAppendingPathComponent:@"lotheve.plist"];
  23.  
  24. //将自定义对象保存在指定路径下
  25. [NSKeyedArchiver archiveRootObject:_p toFile:targetPath];
  26. NSLog(@"文件已储存");
  27. }
  1. - (IBAction)getData:(id)sender
  2. {
  3. //获取文件路径
  4. NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
  5. NSString *targetPath = [docPath stringByAppendingPathComponent:@"lotheve.plist"];
  6.  
  7. TestPerson *person = [NSKeyedUnarchiver unarchiveObjectWithFile:targetPath];
  8. NSLog(@"name = %@ , age =%ld , sex = %@ , familyMubers = %@",person.name,person.age,person.sex,person.familyMumbers);
  9. NSLog(@"文件已提取");
  10. }
  11. @end

TestPerson.h

  1. #import
  2. @interface TestPerson : UIViewController
  3. @property (nonatomic, copy) NSString *name;
  4. @property (nonatomic, assign) NSInteger age;
  5. @property (nonatomic, copy) NSString *sex;
  6. @property (nonatomic, strong) NSArray *familyMumbers;
  7. @end

TestPerson.m

  1. #import "TestPerson.h"
  2. @interface TestPerson ()
  3. @end
  4. @implementationTestPerson
  5. - (void)viewDidLoad
  6. {
  7. [super viewDidLoad];
  8. }
  9.  
  10. #pragma mark - NSCoding协议方法 (一定要实现)
  11. //当进行归档操作的时候就会调用该方法
  12. //在该方法中要写清楚要存储对象的哪些属性
  13. - (void)encodeWithCoder:(NSCoder *)aCoder
  14. {
  15. NSLog(@"调用了encodeWithCoder方法");
  16. [aCoder encodeObject:_name forKey:@"name"];
  17. [aCoder encodeInteger:_age forKey:@"age"];
  18. [aCoder encodeObject:_sex forKey:@"sex"];
  19. [aCoder encodeObject:_familyMumbers forKey:@"familyMumbers"];
  20. }
  21.  
  22. //当进行解档操作的时候就会调用该方法
  23. //在该方法中要写清楚要提取对象的哪些属性
  24. - (id)initWithCoder:(NSCoder *)aDecoder
  25. {
  26. NSLog(@"调用了initWithCoder方法");
  27. if (self = [super init]) {
  28. self.name = [aDecoder decodeObjectForKey:@"name"];
  29. self.age = [aDecoder decodeIntegerForKey:@"age"];
  30. self.sex = [aDecoder decodeObjectForKey:@"sex"];
  31. _familyMumbers = [aDecoder decodeObjectForKey:@"familyMumbers"];
  32. }
  33. return self;
  34. }
  35. @end

点击“保存数据”后,查看沙盒中Documents目录:

点击查看文件内容:

点击“提取数据”后打印结果:

数据存储(直接写入、NSUserDefaults、NSkeyedArchiver)的更多相关文章

  1. iOS中的数据存储方式_Preference(NSUserDefaults)

    NSUserDefaults适合存储轻量级的本地数据,项目中,我会把一些简单的数据密码.网址.登陆状态BOOL.整型/浮点型数据等和用户有关的数据用它存储.但是它不能存储自定义的对象! 实例化一个 N ...

  2. 数据存储简单了解(NSUserDefaults)

    数据存储-使用NSUserDefaults 两个类介绍: NSUserDefaults适合存储轻量级的本地数据,比如要保存一个登陆界面的数据,用户名.密码之类的,个人觉得使用NSUserDefault ...

  3. iOS开发 - OC - 实现本地数据存储的几种方式一

    iOS常用的存储方式介绍 在iOS App开发过程中经常需要操作一些需要持续性保留的数据,比如用户对于App的相关设置.需要在本地缓存的数据等等.本文针对OC中经常使用的一下存储方式做了个整理. 常用 ...

  4. iOS学习之应用数据存储1-属性列表、偏好设置、NSKeyedArchiver归档

    iOS应用数据存储的常用方式(持久化方式) 属性列表(plist)归档(XML文件) Preference(偏好设置) NSKeyedArchiver归档(NSCoding) SQLite3 Core ...

  5. IOS数据存储之NSUserDefaults

    前言: 作为从事Android开发人来说一定听说过SharedPreferences,然后要成为一名ios开发工程师来说咋能不知道NSUserDefaults!接下来让我们认识一下. NSUserDe ...

  6. iOS开发——数据持久化&使用NSUserDefaults来进行本地数据存储

    使用NSUserDefaults来进行本地数据存储   NSUserDefaults适合存储轻量级的本地客户端数据,比如记住密码功能,要保存一个系统的用户名.密码.使用NSUserDefaults是首 ...

  7. iOS边练边学--应用数据存储的常用方式(plist,Preference,NSKeyedArchiver)其中的三种

    iOS应用数据存储的常用方式: XML属性列表(plist)归档 Preference(偏好设置) NSKeyedArchiver归档(NSCoding) SQLite3--这里暂且不讲 Core D ...

  8. IOS 数据存储(NSKeyedArchiver 归档篇)

    什么是归档 当遇到有结构有组织的数据时,比如字典,数组,自定义的对象等在存储时需要转换为字节流NSData类型数据,再通过写入文件来进行存储. 归档的作用 之前将数据存储到本地,只能是字符串.数组.字 ...

  9. IOS中NSUserDefaults的用法(轻量级本地数据存储)

    NSUserDefaults适合存储轻量级的本地数据,比如要保存一个登陆界面的数据,用户名.密码之类的,个人觉得使用NSUserDefaults是首选.下次再登陆的时候就可以直接从NSUserDefa ...

随机推荐

  1. redis编译安装

    centos7 redis-4.0.6 make 报错 jemalloc.h: No such file or directory make MALLOC=libc MALLOC默认值是jemallo ...

  2. linux下WIFI的AP搜索、连接方法

    wpa_supplicant -Dwext -ieth1 -c/etc/wpa_supplicant.conf  &wpa_cli save_configwpa_cli reconfigure ...

  3. 2018面向对象程序设计(Java) 第2周学习指导及要求

    2018面向对象程序设计(Java) 第2周学习指导及要求(2018.9.3-2018.9.9)   学习目标 适应老师教学方式,能按照自主学习要求完成本周理论知识学习: 掌握Java Applica ...

  4. SAP FI模块常用事务代码

    F.52 G/L: Acct Bal.Interest Calculation 总帐:计算科目余额利息 F-06       Post Incoming Payments 收款记帐 F-07      ...

  5. Gamma Correction

    [Gamma Correction] 磁盘上存储的纹理可分为Linear Texture.Gamma Texture. sRGB sampling allows the Unity Editor to ...

  6. 运行VUE的前端项目

    前提条件:已经安装nodejs和cnpm ,参考前一篇文章 1.在前端项目所在的目录下执行cnpm install 下载该项目需要的包,这些包和全局配置下的包可能不同的版本cnpm会根据package ...

  7. Mybatis学习链接

    mybatis实战教程(mybatis in action),mybatis入门到精通   http://blog.csdn.net/techbirds_bao/article/details/923 ...

  8. PERL 正则表达式简介

    来源:脚本之家 网址:http://www.jb51.net/article/17429.htm 一.简介 二.匹配操作符 三.模式中的特殊字符 1.字符+ 2.字符 []和[^] 3.字符 *和? ...

  9. 算法篇【递归2 -- N皇后问题】

    问题:输入整数N,要求在N*N的棋盘上,互相不能攻击,不在同一行同一列上,切不在对角线上,输出全部方案. 输入: 4 输出: 2  4  1  3 3  1  4  2 思路: 假设在前k-1个摆好的 ...

  10. python数据分析之matplotlib学习

    本文作为学习过程中对matplotlib一些常用知识点的整理,方便查找. 类MATLAB API 最简单的入门是从类 MATLAB API 开始,它被设计成兼容 MATLAB 绘图函数. from p ...