六:数据存储的五种方式

hissia hissia     2022-07-31     441

关键词:

  iOS开发中数据存在五种存储方式之三:

    1.plist(XML属性列表归档)

    2.偏好设置

    3.NSKeydeArchiver归档(存储自定义对象)
 
一、plist(XML属性列表归档)只能存取对象类文件
第一种方式:(四个文件夹都可以取出路径)
1 //获取沙盒路径
2     NSString *home = NSHomeDirectory();
3     //获取documents的路径两种方式(其它三个文件夹也能获取)
4     NSString *path = [home stringByAppendingString:@"/documents"];
5     NSString *path1 = [home stringByAppendingPathComponent:@"library/cache"];

第二种方式:(仅有documents和cache能取出路径)(获取路径的时候必须写成YES,否则无法成功写入)

1  //获取cache路径,NO表示文件路径前面用“~”表示
2 NSString *cache = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES) lastObject];
3 NSString *doucument = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) lastObject];
4 //拼接路径
5 NSString *path = [cache stringByAppendingPathComponent:@"abc.plist"];
6 NSString *path1 = [doucument stringByAppendingPathComponent:@"/ce.plist"];
7 //把文件写入文件夹
8 [arr writeToFile:path atomically:YES];
9 [arr writeToFile:path1 atomically:YES];

读取文件:

1 //读取文件
2 NSArray *arr1 =  [NSArray arrayWithContentsOfFile:path];
3 NSLog(@"%@",arr1);

 

二、偏好设置(保存用户名、密码、字体大小、是否自动登录等等基本设置)自动保存到沙盒的Preferences文件夹中

1 //获取对象
2 NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
3 //存储数据
4 [ud setObject:@"abc" forKey:@"这是什么"];
5 [ud setObject:@"cde" forKey:@"俺是"];
6 //读取数据
7 NSString *str = [ud objectForKey:@"俺是"];
8 NSString *str1 = [ud objectForKey:@"这是什么"];
9 NSLog(@"%@---%@",str,str1);

注意:偏好设置存储时候,保存的时间不确定,可能是将来的某个时间存储到文件夹中,所以可以马上同步存储:

    [ud synchronize];

 

三、NSKeyedArchive的归档(存储自定义对象)

在viewController.m中:

 1 - (void)viewDidLoad {
 2     [super viewDidLoad];
 3     
 4     ZWPerson *p = [[ZWPerson alloc] init];
 5     p.name = @"mc";
 6     p.age = 18;
 7     p.height = 1.88;
 8     NSString *cache = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES) lastObject];
 9     NSString *doucument = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) lastObject];
10     //拼接路径
11     NSString *path = [cache stringByAppendingPathComponent:@"abc.doc"];
12     NSString *path1 = [doucument stringByAppendingPathComponent:@"/ce.doc"];
13     //存储数据
14     BOOL ar = [NSKeyedArchiver archiveRootObject:p toFile:path];
15     BOOL ar1 = [NSKeyedArchiver archiveRootObject:p toFile:path1];
16     NSLog(@"%d---%d",ar,ar1);
17     //读取数据
18     ZWPerson *p1 = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
19     ZWPerson *p2 = [NSKeyedUnarchiver unarchiveObjectWithFile:path1];
20     NSLog(@"%zd---%@",p1.age,p2.name);
21 }

新建ZWPerson类(继承自ViewController)

在ZWPerson.h中:

1 #import "ViewController.h"
2 @interface ZWPerson : ViewController
3 /** 名字 */
4 @property (strong, nonatomic)NSString *name;
5 /** 年龄 */
6 @property (assign, nonatomic)NSInteger age;
7 /** 身高 */
8 @property (assign, nonatomic)double height;
9 @end

在ZWPerson.h中:

 1 #import "ZWPerson.h"
 2 @interface ZWPerson ()
 3 @end
 4 @implementation ZWPerson
 5 //存储的时候调用这个方法
 6 - (void)encodeWithCoder:(NSCoder *)aCoder
 7 {
 8     //存储对象的属性(根据实际需要存储数据)
 9     [aCoder encodeObject:self.name forKey:@"name"];
10     [aCoder encodeInteger:self.age forKey:@"age"];
11     [aCoder encodeDouble:self.height forKey:@"height"];
12 }
13 //读取的时候调用
14 - (instancetype)initWithCoder:(NSCoder *)aDecoder
15 {
16     if (self = [super initWithCoder:aDecoder]) {.
17         //获取对象的属性(根据实际需要获取数据)
18         self.name = [aDecoder decodeObjectForKey:@"name"];
19         self.age = [aDecoder decodeIntegerForKey:@"age"];
20         self.height = [aDecoder decodeDoubleForKey:@"height"];
21     }
22     return self;
23 }
24 @end

如果是继承自NSObject:则只需要更改initWithCoder中的if(self = super init)即可

注意:1、遵守NSCoding协议,并实现该协议中的两个方法。

     2、如果是继承,则子类一定要重写那两个方法。因为person的子类在存取的时候,会去子类中去找调用的方法,没找到那么它就去父类中找,所以最后保存和读取的时候新增加的属性会被忽略。需要先调用父类的方法,先初始化父类的,再初始化子类的。

     3、保存数据的文件的后缀名可以随意命名。

     4、通过plist保存的数据是直接显示的,不安全。通过归档方法保存的数据在文件中打开是乱码的,更安全。

史上最全之k8s使用nfs作为存储卷的五种方式(代码片段)

文章目录史上最全之K8s使用nfs作为存储卷的五种方式在`deployment/statefulset`中直接使用创建类型为nfs的持久化存储卷NFSCSIDriver安装使用pv/pvc使用(静态配置)存储类使用(动态配置)NFSSubdirExternalProvisioner安装创建... 查看详情

微信小程序的五种传值方式(代码片段)

1、使用全局变量传递数据利用app.js中的globalData将数据存储为全局变量,在需要使用的页面通过getApp().globalData获取数据app.jsApp(globalData:data:name:'demo')使用组件letapp=getApp()app.globalData.data2、使用本地存储数据传递使用小... 查看详情

list去除重复数据的五种方式,舒服~(代码片段)

以下介绍五种-不同的方法去除Java中ArrayList中的重复数据1.使用LinkedHashSet删除arraylist中的重复数据LinkedHashSet是在一个ArrayList删除重复数据的最佳方法。LinkedHashSet在内部完成两件事:删除重复数据保持添加到其中的数据的顺序... 查看详情

list去除重复数据的五种方式(代码片段)

List在Java开发中用得非常多,数据处理方面,咱们经常需要对重复数据去重。以下介绍五种-不同的方法去除Java中ArrayList中的重复数据1、使用LinkedHashSet删除arraylist中的重复数据LinkedHashSet是在一个ArrayList删除重复数据的最... 查看详情

进程间的五种通信方式介绍(代码片段)

...(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中Socket和Streams支持不同主机上的两个进程IPC。以Linux中的C语言编程为例。一、管道管道,通常指无名管道,是UNIX系统IPC最 查看详情

进程间的五种通信方式介绍(代码片段)

...(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中Socket和Streams支持不同主机上的两个进程IPC。以Linux中的C语言编程为例。一、管道管道,通常指无名管道,是UNIX系统IPC最古老的形式。1、特点... 查看详情

edm营销之数据细分的五种方式

...实现B2B领域的个性化邮件营销呢?首先需要对B2B客户进行数据细分。结合多年来在B2B邮件营销领域的诸多成功实战经验,下面来看看Focussend营销团队在本期为B2B营销者奉上实现B2B个性 查看详情

读取属性配置文件的五种方式(代码片段)

读取属性配置文件的五种方式读取属性配置文件的五种方式读取属性配置的示例属性配置文件方式一:使用注解@Value读取属性配置方式二:使用注解@ConfigurationProperties读取属性配置方式三:使用注解@PropertySou... 查看详情

spring事务配置的五种方法

...部分。  DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hibernate进行数据访问时,DataSource实际为SessionFactory, 查看详情

css的五种定位方式

CSS中一共有五种定位: position:static;默认值 position:absolute;绝对定位 position:relative;相对对定位 position:fixed;固定定位 position:sticky;粘性定位其中,粘性定位是CSS3新增加的兼容性比较差定位的作用: 在正常情况下,可... 查看详情

hibernate缓存中@cache的cacheconcurrencystrategy的五种缓存方式

...Strategy.READ_ONLY简介说明:只读模式,在此模式下,如果对数据进行更新操 查看详情

spring事务配置的五种方式

Spring事务配置的五种方式   前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识。通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较... 查看详情

java并发--线程状态(java线程六种状态操作系统层次的五种状态)线程池(七大核心参数)waitvssleep

...目录1.线程状态1.1Java线程六种状态及转换1.2操作系统层次的五种状态2.线程池(七大核心参数)3.waitvssleep3.1wait()必须配合锁一起使用3.2wait方法执行后会释放锁sleep则不会3.3interrupt()方法可以提前唤醒sleep线程和wait线程1.线... 查看详情

clickhouse数据库删除数据的五种方式(代码片段)

...的方式二、执行delete方式三、执行truncate方式四、设置表数据生命周期五、删除数据文件目录总结前言clickhouse数据库清理数据的方式很多,每种方式都各有自己的优缺点,请根据实际需要采用适合自己的方式,下面逐... 查看详情

ios线程的五种使用方式

//第一种方式  手动创建并启动     NSThread *t = [[NSThread alloc] initWithTarget:self selector:@selector(method) object:nil];     [t start];          //第二种方式  类方法     [NSThread detachNewThreadSelector:@ 查看详情

list去重的五种方式

参考技术ALinkedHashSet是在一个ArrayList删除重复数据的最佳方法。LinkedHashSet在内部完成两件事:Java示例使用LinkedHashSet删除arraylist中的重复项。在给定的示例中,numbersList是包含整数的arraylist,其中一些是重复的数字。例如1,3和5.我... 查看详情

jdbc连接mysql的五种方式(代码片段)

测试环境说明mysql数据库:jdbc:mysql://localhost:3306/testIDE:IDEA2022JDK:JDK8mysql:mysql5.7JDBC:5.1.37第一种方式使用静态加载驱动方式,连接mysql这种方式灵活性差,依赖性强publicvoidconnection01( 查看详情

c#操作redis的五种基本类型总结(代码片段)

    在我们的项目中,通常会把数据存储到关系型数据库中,比如Oracle,SQLServer,Mysql等,但是关系型数据库对于并发的支持并不是很强大,这样就会造成系统的性能不佳,而且存储的数据多为结构化数据,对于非结... 查看详情