iOS UI16_数据持久化

//
//  Student.h
//  UI16_数据持久化
//
//  Created by dllo on 15/8/19.
//  Copyright (c) 2015年 zhozhicheng. All rights reserved.
//

#import <Foundation/Foundation.h>
#pragma mark 假设想实现归档和反归档的操作须要先签订一个协议NSCoding
@interface Student : NSObject<NSCoding>

@property(nonatomic,copy)NSString *name;
@property(nonatomic,copy)NSString *sex;
@property(nonatomic,assign)NSInteger age;
@property(nonatomic,copy)NSString *hobby;

//针对这四条属性,写一个自己定义初始化方法和便利构造器

-(instancetype)initWithName:(NSString *)name
                sex:(NSString *)sex
                age:(NSInteger)age
              hobby:(NSString *)hobby;

+(instancetype)studentWithName:(NSString *)name
                 sex:(NSString *)sex
                 age:(NSInteger)age
               hobby:(NSString *)hobby;

@end
//
//  Student.m
//  UI16_数据持久化
//
//  Created by dllo on 15/8/19.
//  Copyright (c) 2015年 zhozhicheng. All rights reserved.
//

#import "Student.h"

@implementation Student

-(instancetype)initWithName:(NSString *)name
                sex:(NSString *)sex
                age:(NSInteger)age
              hobby:(NSString *)hobby
{
    self=[super init];
    if (self) {
        _age =age;
        _name =name;
        _hobby =hobby;
        _sex =sex;
    }
    return self;
}

+(instancetype)studentWithName:(NSString *)name
                           sex:(NSString *)sex
                           age:(NSInteger)age
                         hobby:(NSString *)hobby
{
    Student *stu = [[Student alloc] initWithName:name sex:sex age:age hobby:hobby];
    return stu;
}

#pragma mark 签订完NSCoding协议之后,须要实现两个协议方法,一个是归档的时候使用的,一个是反归档的时候使用的
- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:self.name forKey:@"姓名"];
    [aCoder encodeInteger:self.age forKey:@"年龄"];
    [aCoder encodeObject:self.hobby forKey:@"爱好"];
    [aCoder encodeObject:self.sex forKey:@"性别"];
    //使用encode方法要和数据的类型相互匹配
}

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super init];
    if (self) {
        //把数据依据之前的key再反编译回来
        self.name = [aDecoder decodeObjectForKey:@"姓名"];
        self.age = [aDecoder decodeIntegerForKey:@"年龄"];
        self.hobby = [aDecoder decodeObjectForKey:@"爱好"];
        self.sex = [aDecoder decodeObjectForKey:@"性别"];

    }
    return self;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
//
//  ViewController.m
//  UI16_数据持久化
//
//  Created by dllo on 15/8/19.
//  Copyright (c) 2015年 zhozhicheng. All rights reserved.
//

#import "ViewController.h"
#import "Student.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    //苹果手机为了保证自己数据上的绝对安全,设计了沙盒文件,每个应用程序上都配备了自己的沙盒文件,每一次执行,目录的名字就会变成一个没有不论什么规律的字符串
    //第一个參数:当前要前往那一个目录,前往documents文件用NSDocuemtDirectory,64行那个,还能够前往caches目录,相应68行
    //第二个參数:訪问的目录类型,指定訪问是用户目录
    //第三个參数:绝对路径(YES),相对路径(NO)
    //绝对路径是给系统使用的,系统能够依据当前的路径找到目录,我们在操作目录时是绝对路径
    //相对路径仅仅会把要前往的目录显示,其它部分都是~,告诉程序猿要去哪个目录
//    NSArray *sandbox =NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
//    NSLog(@"%@",sandbox[0]);
    //沙盒里一共同拥有三个文件
    //1.是Documents文件:主要用来存储用户的想要存储的一些信息,比方收藏的信息或者自己设置的一些内容,所以我们做收藏功能就是前往这个目录里写文件
    //2.Library目录里是方便程序开发人员的,主要操作它里面的两个目录,caches和Preferences
    //caches:用来保存缓存文件,SDWebImage会把图片加到缓存文件里,所以清除缓存功能就是把这个目录删除
    //Preferences:一般来保存程序猿设置的信息,比方NSUserDefults就会把数据保存在这个目录里
    //3.tmp文件:一般存放暂时内容
    //之前在沙盒里另一个.app文件,在新的版本号里已经被移走了
    //把简单对象写入到本地,简单对象指的是NSString,NSArray

//    //1.先通过数组获取沙盒路径
//    NSArray *sandbox = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
//    //从数组里获取沙盒路径
//    NSString *sandBoxPath =sandbox[0];
//    //要给写入的文件拼接一个路径,拼接方式有两种
////    NSString *documentPath = [sandBoxPath stringByAppendingString:@"/顾宇.txt"];
//
//    NSString *documentPath = [sandBoxPath stringByAppendingPathComponent:@"顾宇.xml"];
//    NSLog(@"%@",documentPath);

//    NSString *str = @"书山有路勤为径,学海无涯苦作舟";
//    //把字符串写入到本地
//    //第一个參数:文件要保存的路径
//    //第二个參数:对文件进行保护YES
//    //第三个參数:编码
//    //第四个參数,错误信息
//    [str writeToFile:documentPath atomically:YES encoding:NSUTF8StringEncoding error:nil];
//    //假设路径下有相应的文件,则会把原来文件覆盖,假设没有则创建一个新文件
//    //把沙盒文件读出来
//    NSString *temoStr = [NSString stringWithContentsOfFile:documentPath encoding:NSUTF8StringEncoding error:nil];
//    NSLog(@"%@",temoStr);

//    //把数组写入到本地
//    NSArray *arr [email protected][@"1",@"2",@"3",@"4",@"5",@"6"];
//    //通过数组获取沙盒地址
//    NSArray *sandbox = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
//    //用字符串保存沙盒路径
//    NSString *sandboxPath = sandbox[0];
//    //给要写入的文件拼接路径
//    NSString *documentPath = [sandboxPath stringByAppendingPathComponent:@"哈哈.plist"];
//    //把数组写入到本地
//    [arr writeToFile:documentPath atomically:YES];
//    NSLog(@"%@",documentPath);
//
//    //把数组读出来
//    NSArray *temp = [NSArray arrayWithContentsOfFile:documentPath];
//    NSLog(@"%@",temp);

//    //把字典写入到本地
//    NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"1",@"2", nil];
//    NSArray *sandbox = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
//    NSString *sandboxPath = sandbox[0];
//    NSString *documentPath = [sandboxPath stringByAppendingPathComponent:@"嘿嘿"];
//    [dic writeToFile:documentPath atomically:YES];
//    NSLog(@"%@",documentPath);
//
//    NSDictionary *temp = [NSDictionary dictionaryWithContentsOfFile:documentPath];
//    NSLog(@"%@",temp);

    //复杂对象写入到本地,主要指我们自己创建的对象写入到本地,也叫归档和犯反归档操作

    //创建对象呢
//    Student *stu1 = [Student studentWithName:@"张三" sex:@"男" age:14 hobby:@"玩"];

//    //1.通过数组获取沙盒路径
//    NSArray *sandbox = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
//    //2.用字符串截取沙盒路径
//    NSString *sandBoxPath = sandbox[0];
//    //3.拼接目录路径,这个目录扩展名是随意的
//    NSString *decomentPath = [sandBoxPath stringByAppendingPathComponent:@"学生.avi"];
//    //对对象进行归档操作
//    //第一个參数:要实施归档的对象
//    //第二个參数:路径
//    [NSKeyedArchiver archiveRootObject:stu1 toFile:decomentPath];
//    NSLog(@"%@",decomentPath);
//
//    //反归档
//    Student *newStu = [NSKeyedUnarchiver unarchiveObjectWithFile:decomentPath];
//    NSLog(@"%@",newStu.name);

//    //创建三个学生
//    Student *stu1 = [Student studentWithName:@"张三" sex:@"男" age:14 hobby:@"玩"];
//    Student *stu2 = [Student studentWithName:@"李四" sex:@"女" age:15 hobby:@"睡觉"];
//    Student *stu3 = [Student studentWithName:@"神六" sex:@"男" age:16 hobby:@"唱歌"];
//    NSArray *array = @[stu1,stu2,stu3];
//
//    NSArray *sandbox = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 1, YES);
//    NSString *sandboxPath = sandbox[0];
//    //拼接文件路径
//    NSString *documentPath = [sandboxPath stringByAppendingPathComponent:@"曹军.plist"];
//    //归档操作
//    [NSKeyedArchiver archiveRootObject:array toFile:documentPath];
//    NSLog(@"%@",documentPath);
//
//    //反归档,遍历学生姓名
//    NSArray *arr = [NSKeyedUnarchiver unarchiveObjectWithFile:documentPath];
//    for (Student *temp in arr) {
//        NSLog(@"%@",temp.name);
//    }

#warning 总结:数据持久化的步骤
    //1.指定前往那一个目录
    //2.用字符串接收路径
    //3.拼接文件路径
    //4.写入本地或归档操作
    //注;假设是复杂对象归档,要签订NSCoding协议,而且实现两个协议方法,放在数组里的复杂对象归档也要签协议

//    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
//    [defaults setObject:@"123456" forKey:@"password"];
//    NSArray *sandBox = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 1, YES);
//    NSLog(@"%@",sandBox[0]);
//    NSLog(@"%@",[defaults objectForKey:@"password"]);
    //NSUserDefaults一般存放的是小的数据,比方字符串等,它的使用方法和字典相似

    //通过文件管理者对目录进行操作
    NSArray *sandBox = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 1, YES);
    NSString *sandBoxPath =sandBox[0];
    //创建一个文件管理者
    NSFileManager *manager = [NSFileManager defaultManager];
    //给要创建的目录拼接一个路径
    NSString *filePath = [sandBoxPath stringByAppendingPathComponent:@"guyu"];
    //目录的名不须要扩展名
    //通过manager进行目录的创建
    [manager createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:nil];
    NSLog(@"%@",filePath);
    //向目录里写入一个字符串
    NSString *documentPath = [filePath stringByAppendingPathComponent:@"字符串.txt"];
    NSString *str = @"我是字符串";
    [str writeToFile:documentPath atomically:YES encoding:NSUTF8StringEncoding error:nil];

    //移除目录
//    [manager removeItemAtPath:filePath error:nil];
//
    //清除缓存
    NSArray *cache = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, 1, YES);
    NSString *cachePath =cache[0];
    [manager removeItemAtPath:cachePath error:nil];

}

@end
时间: 2024-10-07 16:14:43

iOS UI16_数据持久化的相关文章

iOS 中级数据持久化——简单的数据库(Sqlite3)

sqlite是嵌入式的和轻量级的sql数据库.sqlite是由c实现的.广泛用于包括浏览器(支持html5的大部分浏览器,ie除外).ios.android以及一些便携需求的小型web应用系统. 数据库无非就是增,删,改,查四种.除了查询以为,其他的三种方法比较类似 //使用数据库之前,打开数据库 - (void)openDB { if (db != nil) { return; } //数据库存储在沙河中的caches文件夹下 NSString * cachesPath = [NSSearch

IOS开发--数据持久化篇之文件存储(一)

前言:个人觉得开发人员最大的悲哀莫过于懂得使用却不明白其中的原理.在代码之前我觉得还是有必要简单阐述下相关的一些知识点. 因为文章或深或浅总有适合的人群.若有朋友发现了其中不正确的观点还望多多指出,不胜感激. 什么叫数据持久化: 在这里我就不照搬教科书上抽象的概念了.我觉得既然要把东西写出来就让它简单明了. 要搞清楚数据持久化,首先要知道数据持久化是相对于缓存而言的,缓存是在程序运行的过程中保存在内存中,程序一旦运行结束,其内存就会被释放.缓存在内存中的数据也就随之消失. 那么数据持久化就是要解

iOS开发——数据持久化OC篇&amp;总结

数据持久化总结 1 //1.沙盒:/Users/nono/Library/Application Support/iPhone Simulator/5.1/Applications/2D135859-1E80-4754-B36D-34A53C521DE3 2 /** 3 // 1.获取程序的Home目录 4 NSString *home = NSHomeDirectory(); 5 NSLog(@"应用程序目录:%@", home); 6 7 // 2.获取Documents目录 8

iOS 中数据持久化方案

咱们所说的数据持久化,就是将数据保存到硬盘中,使得在应用程序或者是机器重新启动还可以访问之前的保存的数据,在ios 开发中有很多韩剧持久化方案 ,下面我来介绍我们常用的5种解决方案 1 plist文件 (属性列表); 2 preference (偏好设置); 3 NSKeyedArchiver (归档); 4 SQLite 3;(轻量级数据库) 5 CoreData *沙盒机制 就是说ios 程序默认情况下只能访问程序自己的目录,这个目录就是咱们所说的沙盒; 1 沙盒的具体结构 目录 1 Doc

iOS开发数据持久化技术01——NSUserDefault介绍

有疑问的请加qq交流群:390438081 我的QQ:604886384(注明来意) 微信:niuting823 首先说下什么是数据持久化技术 NSString *str = @"hello world"; ->内存 实际上就是将数据存储到硬盘上,针对于iOS应用程序是存储到沙盒中. . NSUserDefault介绍 1 是系统提供的自定义的类,可以随时在需要使用的地方声明对象,并随时需要的时候取出对象 2 支持的对象类型:NSString, NSNumber, NSData,

IOS开发-数据持久化(一)【文本文件+二进制归档】

概要 数据持久化分为不同的方式,本章主要简示了数据归档(一般而说的序列化)和写XML的文本文件方式.其中XML文本方式主要使用NSArray或者NSDictionary的writeToFile方法,而数据归档使用了NSKeyedArchiver/NSKeyedUnarchiver等实现数据的归档(序列化). 结果展示 程序展示 数据化文件 注意新版本的IOS模拟器的目录和以前的目录不在同一个地方,其中plist文件是XML文件,可打开直接查看,而archi是归档的二进制文件. 流程概要 1.新建

QF——iOS中数据持久化的几种方式

数据持久化的几种方式: 一.属性列表文件: .plist文件是种XML文件.数组,字典都可以和它互相转换. 读取plist文件生成数组:plist——>NSArray 把数组写入plist文件:NSArray——>plist 二.NSUserDefaults: 它是单例的.通过[NSUserDefaults standardUserDefaults];提供唯一的实例 NSUserDefaults存储数据,本质上就是属性列表plist文件里.只不过是系统提供的,存储位置固定的,它存储在沙盒的Li

iOS开发——数据持久化OC篇&amp;(二)属性列表

属性列表 属性列表文件是一种XML文件,Foundation框架中的数组和字典等都可以于属性列表文件相互转换. NSArray类常用读写属性列表文件的方法: +arrayWithContentsOfFile:类级构造方法,用于从属性列表文件中读取数据,创建NSArray对象. -initWithContentsOfFile:实例构造方法,用于从属性列表文件中读取数据,创建NSArray对象. -writeToFile:atomically:该方法把NSArray对象写入到属性列表文件中,第一个参

iOS开发——数据持久化OC篇&amp;(三)对象归档

归档 iOS开发UI篇—ios应用数据存储方式(归档)  一.简单说明 在使用plist进行数据存储和读取,只适用于系统自带的一些常用类型才能用,且必须先获取路径相对麻烦: 偏好设置(将所有的东西都保存在同一个文件夹下面,且主要用于存储应用的设置信息) 归档:因为前两者都有一个致命的缺陷,只能存储常用的类型.归档可以实现把自定义的对象存放在文件中. 二.代码示例 1.文件结构 2.代码示例 YYViewController.m文件 1 // 2 // YYViewController.m 3 /