持久化存储——偏好设置,plist,归档---学习笔记二

//一. 本地持久化

    //1.沙盒

   //1.1 应用程序包:存放的是应用程序的源文件,包括资源文件和可执行文件

    NSString *path = [[NSBundle mainBundle]bundlePath];

   //1.2 Documents:最常用的目录,iTunes同步该应用时会同步此文件夹中的内容,适合存储重要数据

    NSString *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES).firstObject;

    //1.3 Library

   //1.3.1  Caches:iTunes不会同步此文件夹,适合存储体积大,不需要备份的非重要数据。

    NSString *cachs = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;

   //1.4 Preferences:iTunes同步该应用时会同步此文件夹中的内容,通常保存应用的设置信息。

  //1.5 tmp: iTunes不会同步此文件夹,系统可能在应用没运行时就删除该目录下的文件,所以此目录适合保存应用中的一些临时文件,用完就删除。

   NSString *tmpPath = NSTemporaryDirectory();

 //---打印的地址,前往->前往文件夹->输入//Users/xingzai/Library/Developer 就可以进入到当前文件夹下

  //二 . Plist 存储

  //2.1 plist文件是将某些特定的类,通过XML文件的方式保存在目录中。

    //可以被序列化的类型只有如下几种

   //-----根目录

    //NSArray;//数组

    //NSDictionary;//字典

  //-----子属性

    //NSArray;//数组

    //NSDictionary;//字典

//    NSMutableArray;//可变数组

//    NSMutableDictionary;//可变字典

//    NSData;//二进制数据

//    NSMutableData;//可变二进制数据

//    NSString;//字符串

//    NSMutableString;//可变字符串

//    NSNumber;//基本数据

//    NSDate;//日期

   //2.2 下面以数组为例

    //2.2.1存储

    NSString *plistPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;

    NSArray *arr = @[@{@"1":@"num"},@{@"2":@"num"},@{@"3":@"num"},@{@"4":@"num"},@{@"5":@"num"}];

  //stringByAppendingPathComponent是到目录下/,如a/

    [arr writeToFile:[plistPath stringByAppendingPathComponent:@"1.plist"] atomically:YES];

    //stringByAppendingString 是和当前目录平级的,和a共处一个目录里

//    [arr writeToFile:[plistPath stringByAppendingString:@"1.plist"] atomically:YES];

    //2.2.2 取

    NSArray *contentArray = [NSArray arrayWithContentsOfFile:[plistPath stringByAppendingPathComponent:@"1.plist"]];

    NSLog(@"%@",contentArray);

    //三. Preference(偏好设置)

//    偏好设置是专门用来保存应用程序的配置信息的,一般不要在偏好设置中保存其他数据。

//    偏好设置是以key-value的方式进行存储和读写,使用到一个单例对象NSUserDefaults

    //存

    NSUserDefaults *keyDefault = [NSUserDefaults standardUserDefaults];

     [keyDefault setObject:@"xingZai" forKey:@"name"];

    [keyDefault setBool:YES forKey:@"sex"];

    [keyDefault setInteger:30 forKey:@"age"];

    //立即同步

    [keyDefault synchronize];

    //取

    NSString *name = [keyDefault objectForKey:@"name"];

    NSInteger age = [keyDefault integerForKey:@"age"];

    BOOL sex = [keyDefault boolForKey:@"sex"];

    //oc 的BOOL用%d表示,c的bool用%s表示,

    NSLog(@"name = %@ age =%ld sex=%d",name,age,sex);

//    如果没有调用synchronize方法,系统会根据I/O情况不定时刻地保存到文件中。所以如果需要立即写入文件的就必须调用synchronize方法。

//    偏好设置会将所有数据保存到同一个文件中,使用同一个key进行存储数据,会覆盖之前存储的数据。

    //四 、归档与解档

//    归档在iOS中是另一种形式的序列化,只要遵循了NSCoding协议的对象都可以通过它实现序列化。由于绝大多数支持存储数据的类都遵循了NSCoding协议,因此,对于大多数类来说,归档相对而言还是比较容易实现的。

//    1. 遵循NSCoding协议

//    NSCoding协议声明了两个方法,这两个方法都是必须实现的:

//    encodeWithCoder:用来说明如何将对象编码到归档中。

//    initWithCoder:用来说明如何进行解档来获取一个新对象。

//    @interface Student : NSObject<NSCoding>

//    

//    @property (nonatomic, copy) NSString *name; //名字

//    @property (nonatomic, assign) BOOL sex; //性别,NO 为女,YES为男

//    @property (nonatomic, assign) NSInteger age; //年龄

//    

//    

//    @end

//#import "Student.h"

//    

//    @implementation Student

//    

//    //解档 ( decoder 解码器;译码员)

//    - (instancetype)initWithCoder:(NSCoder *)aDecoder{

//        

//        if (self = [super init]) {

//            self.name = [aDecoder decodeObjectForKey:@"name"];

//            self.sex = [aDecoder decodeBoolForKey:@"sex"];

//            self.age = [aDecoder decodeIntegerForKey:@"age"];

//        }

//        return self;

//    }

//    //归档 (aCoder 归档)

//    - (void)encodeWithCoder:(NSCoder *)aCoder{

//        [aCoder encodeObject:self.name forKey:@"name"];

//        [aCoder encodeBool:self.sex forKey:@"sex"];

//        [aCoder encodeInteger:self.age forKey:@"age"];

//    }

//    @end

    //2. NSKeyedArchiver归档

//    调用NSKeyedArchiver的archiveRootObject:toFile:方法把对象归档

    NSString *keyPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;

    NSString *file = [keyPath stringByAppendingPathComponent:@"student.data"];

    Student *student = [[Student alloc] init];

    student.name = @"五宝";

    student.sex = YES;

    student.age = 22;

    BOOL isSuccess = [NSKeyedArchiver archiveRootObject:student toFile:file];

    if (isSuccess) {

        NSLog(@"写入成功");

    }

    //3. NSKeyedUnarchiver 解档

  // 调用 NSKeyedUnarchiver unarchiveObjectWithData: 取出相应的数据

    NSString *unkeyPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;

    NSString *unfile = [unkeyPath stringByAppendingPathComponent:@"student.data"];

    Student *unStudent = [NSKeyedUnarchiver unarchiveObjectWithFile:unfile];

    if (unStudent) {

        self.students = unStudent;

//        self.students.name = unStudent.name;

//        self.students.sex = unStudent.sex;

//        self.students.age = unStudent.age;

        NSLog(@"unStudent:name=%@ sex=%d age=%ld",self.students.name,self.students.sex,self.students.age);

    }
时间: 2024-12-15 18:50:03

持久化存储——偏好设置,plist,归档---学习笔记二的相关文章

angular学习笔记(二十六)-$http(4)-设置请求超时

本篇主要讲解$http(config)的config中的timeout项: $http({ timeout: number }) 数值,从发出请求开始计算,等待的毫秒数,超过这个数还没有响应,则返回错误 demo: html: <!DOCTYPE html> <html ng-app = 'HttpGet'> <head> <title>18.4 $http(2)</title> <meta charset="utf-8"

angular学习笔记(二十四)-$http(2)-设置http请求头

1. angular默认的请求头: 其中,Accept 和 X-Requested-With是$http自带的默认配置 2. 修改默认请求头: (1) 全局修改(整个模块) 使用$httpProvider依赖 var myApp = angular.module('MyApp',[]); myApp.config(function($httpProvider){ console.log($httpProvider.defaults.headers.common) //修改/操作$httpProv

小猪的数据结构学习笔记(二)

小猪的数据结构学习笔记(二) 线性表中的顺序表 本节引言: 在上个章节中,我们对数据结构与算法的相关概念进行了了解,知道数据结构的 逻辑结构与物理结构的区别,算法的特性以及设计要求;还学了如何去衡量一个算法 的好坏,以及时间复杂度的计算!在本节中我们将接触第一个数据结构--线性表; 而线性表有两种表现形式,分别是顺序表和链表;学好这一章很重要,是学习后面的基石; 这一节我们会重点学习下顺序表,在这里给大家一个忠告,学编程切忌眼高手低,看懂不代表自己 写得出来,给出的实现代码,自己要理解思路,自己

Spring Batch学习笔记二

此系列博客皆为学习Spring Batch时的一些笔记: Spring Batch的架构 一个Batch Job是指一系列有序的Step的集合,它们作为预定义流程的一部分而被执行: Step代表一个自定义的工作单元,它是Job的主要构件块:每一个Step由三部分组成:ItemReader.ItemProcessor.ItemWriter:这三个部分将执行在每一条被处理的记录上,ItemReader读取每一条记录,然后传递给ItemProcessor处理,最后交给ItemWriter做持久化:It

【Unity 3D】学习笔记二十六:unity游戏脚本(六)

在3D游戏世界中,任何一个游戏对象在创建的时候都会附带Transform(变换)组件,并且该组件是无法删除的,也不应该删除.在unity中,Transform面板一共有3个属性: Position  (位置) Rotation(旋转) Scale(缩放) 这三个值都是用来调整游戏对象在游戏界面中的位置,状态等相关参数. Position  (位置) 任何一个游戏对象的三维坐标都保存在Vector3容器中,该容器记录对象在X轴,Y轴,Z轴的坐标.一旦Vector33容器中的坐标发生变化,那么Sce

APUE 学习笔记(二) 文件I/O

1. 文件I/O 对于内核而言,所有打开的文件都通过文件描述符引用,内核不区分文本文件和二进制文件 open函数:O_RDONLY  O_WRONLY  O_RDWR create函数: close函数:关闭一个文件时还会释放该进程加在该文件上的所有记录锁 lseek函数:显式地为一个打开的文件设置其偏移量 每个打开的文件都有一个与其相关联的 "当前文件偏移量",用以度量从文件开始处计算的字节数,通常,读.写操作都从当前文件偏移量处开始,并使偏移量增加所读写的字节数 文件偏移量可以大于

CCNA 学习笔记(二)--CISCO设备初接触

CCNA 学习笔记(二)--初识CISCO设备 上一章我们认识到网络方面的基础知识了,现在我们正式接触CISCO设备. 1.首先我们先了解一台CISCO设备里的主要组件: ROM(只读存储器):主要保存着开机自检软件.保存路由器启动引导程序. RAM(随机存储器):断电会把数据丢失.可以存储配置文件.>>>相当于PC的内存 NVRAM(非易失存储器):断电不会丢失.用来保存用户配置文件.IP.startup-config.主机名.路由协议等等. FLASH(闪存):主要是保存完整的   

Linux System Programming 学习笔记(二) 文件I/O

1.每个Linux进程都有一个最大打开文件数,默认情况下,最大值是1024 文件描述符不仅可以引用普通文件,也可以引用套接字socket,目录,管道(everything is a file) 默认情况下,子进程会获得其父进程文件表的完整拷贝 2.打开文件 open系统调用必须包含 O_RDONLY,O_WRONLY,O_RDWR 三种存取模式之一 注意 O_NONBLOCK模式 int fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0644

AJax 学习笔记二(onreadystatechange的作用)

AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了onreadyStateChange事件实现这一功能.这类似于回调函数的做法.onreadyStateChange事件可指定一个事件处理函数来处理XMLHttpRequest对象的执行结果,如: 复制代码 代码如下: ajaxObj=createAjaxObject(); var url="/MyTod