你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS UI16_數據持久化

iOS UI16_數據持久化

編輯:IOS開發綜合
//
//  Student.h
//  UI16_數據持久化
//
//  Created by dllo on 15/8/19.
//  Copyright (c) 2015年 zhozhicheng. All rights reserved.
//

#import 
#pragma mark 如果想實現歸檔和反歸檔的操作需要先簽訂一個協議NSCoding
@interface Student : NSObject

@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];


}


 
  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved