1. 程式人生 > >iOS UI16_數據持久化

iOS UI16_數據持久化

spl 什麽 手機 function 定義 lin rip clas sin

//
//  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 =@[@"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

iOS UI16_數據持久化