亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

iOS數據持久化(一)

2019-11-14 18:20:42
字體:
來源:轉載
供稿:網友

一、什么是數據持久化

數據持久化及數據的永久存儲,將數據保存在硬盤中,程序關閉,內存釋放后,重新打開程序,可以繼續訪問之前保存的數據。

二、數據持久化方式

常見的數據持久化方式有以下幾項:

沙盒

PReference

歸檔 / 反歸檔

SQLite

CoreData

這篇只講沙盒,preference,歸檔/反歸檔。

1.沙盒

沙盒是系統為每一個應用程序生成的一個特定文件夾   文件夾的名字由十六進制數據組成,每一個應用程序的沙盒文件名都是不一樣的,是由系統隨機生成的。

    //獲取沙盒主目錄    NSString *path = NSHomeDirectory();    NSLog(@"%@",path);

沙盒下每個文件夾的路徑及作用

//Documents  存放的一些比較重要的文件,但是存入Documents中的文件不能過大    //如何獲取Documents文件目錄    NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];    NSLog(@"%@",documentsPath);    //用firstobject取值是因為該方法一開始使用mac端OS X開發,對于PC端用戶可以有多個用戶,所以可以取到很多user的路徑,但是該方法現在用于手機開發,手機端只有一個用戶,所以獲得的用戶只有一個,lastobject也是可以的。        //Library:是一個資源庫,存儲一些不太重要的數據,相對比較大一些,里邊有兩個子文件夾;    NSString *libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES)firstObject];    //Caches:緩存文件,圖片緩存,音頻,視頻。網頁資源。應用程序清除緩存,就是清除該文件夾    NSString *cachesPath  = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)firstObject];    //Preferences:系統偏好設置,用戶對應程序的設置,比如用戶名和用戶密碼,preference路徑無法找到,通過NSUserDefaults        //temp:存放臨時文件,比如下載的壓縮包zip,解壓后理解把壓縮包刪除    NSString *tempPath = NSTemporaryDirectory();    NSLog(@"%@",tempPath);    //bundle:ios8之前,包和沙河在同一個目錄下,之后.app單獨存儲到一個獨立的文件目錄下。 .app 文件 readOnly。從appStore下載下來的是這個包,程序上傳的時候也是這個包    NSString *bundlepath = [[NSBundle mainBundle] bundlePath];    NSLog(@"%@",bundlepath);
    // NSSearchPathDirectory 這個類是用來查找文件目錄的    //第一個參數:文件名稱    //第二個參數,確定搜索域    //第三個參數:確定相對路徑還是絕對路徑。YES絕對,NO相對

文件相關操作

/** *  文件刪除 */- (void)deleteFile {    NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];     NSString *imagePath = [cachesPath stringByAppendingPathComponent:@"iamge"];    NSLog(@"%@",imagePath);    //創建文件管理者    NSFileManager *fileManager =  [NSFileManager defaultManager];    //判斷文件是否存在    BOOL isExist = [fileManager fileExistsAtPath:imagePath];    if (!isExist) {        BOOL isSuccess = [fileManager createDirectoryAtPath:imagePath withIntermediateDirectories:YES attributes:nil error:nil];        NSLog(@"%@",isSuccess ? @"創建成功" : @"創建失敗");    }    //刪除文件    if ([fileManager fileExistsAtPath:imagePath]) {        BOOL isSucess = [fileManager removeItemAtPath:imagePath error:nil];        NSLog(@"%@",isSucess ? @"刪除成功" : @"刪除失敗");    }}
/** *  移動 */- (void)moveFile {    NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];        NSString *imagePath = [cachesPath stringByAppendingPathComponent:@"iamge"];    NSLog(@"%@",imagePath);    //創建文件管理者    NSFileManager *fileManager =  [NSFileManager defaultManager];    //判斷文件是否存在    BOOL isExist = [fileManager fileExistsAtPath:imagePath];    if (!isExist) {        BOOL isSuccess = [fileManager createDirectoryAtPath:imagePath withIntermediateDirectories:YES attributes:nil error:nil];        NSLog(@"%@",isSuccess ? @"創建成功" : @"創建失敗");    }    //刪除文件    //    if ([fileManager fileExistsAtPath:imagePath]) {    //        BOOL isSucess = [fileManager removeItemAtPath:imagePath error:nil];    //        NSLog(@"%@",isSucess ? @"刪除成功" : @"刪除失敗");    //    }    //拷貝文件    //    把包中的plist文件拷貝到image文件夾下    NSString *plistInBundlePath = [[NSBundle mainBundle] pathForResource:@"NB.plist" ofType:nil];        NSString *nBPath = [imagePath stringByAppendingPathComponent:@"NB.plist"];    // 拷貝,    if (![fileManager fileExistsAtPath:nBPath]) {        BOOL isSuccess = [fileManager copyItemAtPath:plistInBundlePath toPath:nBPath error:nil];        NSLog(@"%@",isSuccess ? @"拷貝成功" : @"拷貝失敗");    }        NSString *toPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject];    BOOL isSuccess = [fileManager moveItemAtPath:nBPath toPath:[toPath stringByAppendingPathComponent:@"NB.plist"] error:nil];    NSLog(@"%@",isSuccess ? @"移動成功" : @"移動失敗");    }
//字符串寫入文件- (void)writeToFile {    //簡單對象寫入文件:字符串,數組,字典,二進制流 只有這些簡單對象支持文件的寫入    //如果要寫入的文件數據時數組,字典,必須要保證數組,字典中的數據 也是簡單對象(如果是復雜對象,請參照后邊的歸檔,反歸檔)    //將字符串寫入Documents文件夾下    NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject];    NSString *toPath = [documentsPath stringByAppendingPathComponent:@"string.txt"];    NSString *string = @"string-string-string-";    //第一個參數,要寫入的文件路徑,如果不存在文件,會自動創建    第二個參數,原子性,判斷是否需要生成輔助文件,保護在多線程下安全    第三個參數,編碼格式    第四個參數,錯誤信息    NSError *error = nil;    BOOL isSuccess = [string writeToFile:toPath atomically:YES encoding:NSUTF8StringEncoding error:&error];    NSLog(@"%@",isSuccess ? @"寫入成功" : @"寫入失敗");        NSString *str = [NSString stringWithContentsOfFile:toPath encoding:NSUTF8StringEncoding error:nil];    NSLog(@"%@",str);}
//數組寫入文件- (void)writeArray {        NSString *str = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES)firstObject];    NSString *toPath = [str stringByAppendingPathComponent:@"array.txt"];    NSArray *array = @[@"123",@"123"];    BOOL isSuccess = [array writeToFile:toPath atomically:YES];    NSLog(@"%@",isSuccess ? @"寫入成功" : @"寫入失敗");        NSArray *arr = [NSArray arrayWithContentsOfFile:toPath];    NSLog(@"%@",arr);}
//字典寫入文件- (void)writeDic {    NSDictionary *dic = @{@"key":@"value"};    NSString *str = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)firstObject];    NSString *toPath = [str stringByAppendingPathComponent:@"dictonry.txt"];    BOOL isSuccess = [dic writeToFile:toPath atomically:YES];    NSLog(@"%@",isSuccess ? @"成功" : @"失敗");    NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:toPath];    NSLog(@"%@",dict);}
//NSData寫入文件- (void)writeData {    NSString *tempPath = NSTemporaryDirectory();    NSString *toPath = [tempPath stringByAppendingPathComponent:@"data.txt"];    NSString *string = @"datadata";    NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];    BOOL isSuccess = [data writeToFile:toPath atomically:YES];    NSLog(@"%@",isSuccess ? @"成功" : @"失敗");    NSData *getData = [NSData dataWithContentsOfFile:toPath];    NSString *str = [[NSString alloc] initWithData:getData encoding:NSUTF8StringEncoding];    NSLog(@"%@",str);}

2.preference

//Preference- (void)writeToPreference {    // NSUserDefaults 繼承自NSObject ,單例     通過kvc模式賦值    NSLog(@"%@",NSHomeDirectory());    //創建用戶索引對象    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];    [defaults setInteger:100 forKey:@"money"];    //立即同步操作      對preference中的文件進行修改后,立即同步    [defaults synchronize];    NSInteger money = [defaults integerForKey:@"money"];    NSLog(@"%ld",money);    [defaults setInteger:10000 forKey:@"MyMoney"];    [defaults synchronize];        NSInteger you = [defaults integerForKey:@"you"];    NSLog(@"%ld",(long)you);    if (money < 10) {        NSLog(@"there is no money");    } else {        NSLog(@"-100");        money -= 100;        [defaults setInteger:40 forKey:@"money"];        [defaults setInteger:1000 forKey:@"YourMoney"];    }    // NSUserDefaults 一般存儲一些比較小的數據,大部分用來存數值        //例子:判斷用戶是否第一次登陸    NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];    BOOL isFirst = [userDefault boolForKey:@"isFirst"];    [userDefault setBool:YES forKey:@"isFirst"];    [userDefault synchronize];    if (!isFirst) {        NSLog(@"第一次登陸");    } else {        NSLog(@"不是第一次登陸");    }}

3.歸檔 / 反歸檔

復雜對象寫入文件需要使用歸檔 ,讀取需要使用反歸檔,不能直接寫入文件,數組中有復雜對象也要使用歸檔 / 反歸檔

復雜對象使用行歸檔和反歸檔,需要遵循NSCoding協議,并實現協議中- (void)encodeWithCoder:(NSCoder *)aCoder;   - (id)initWithCoder:(NSCoder *)aDecoder; 兩個方法

 

新建Person類

在Person.h中 遵循協議

////  Person.h//  07.24-DataPersistiser////  Created by lanouhn on 14/7/24.//  Copyright (c) 2014年 LCD. All rights reserved.//#import <Foundation/Foundation.h>@interface Person : NSObject <NSCoding>@property (nonatomic, copy) NSString *name;@property (nonatomic, copy) NSString *gender;@property (nonatomic, assign) NSInteger age;@end

在Person.m中實現協議方法

////  Person.m//  07.24-DataPersistiser////  Created by lanouhn on 14/7/24.//  Copyright (c) 2014年 LCD. All rights reserved.//#import "Person.h"@implementation Person//當要歸檔時,對象會自動觸發這個方法- (void)encodeWithCoder:(NSCoder *)aCoder {    [aCoder encodeObject:self.name forKey:@"name"];    [aCoder encodeObject:self.gender forKey:@"gender"];    [aCoder encodeObject:@(self.age) forKey:@"age"];}- (id)initWithCoder:(NSCoder *)aDecoder {    self = [super init];    if (self) {        self.name = [aDecoder decodeObjectForKey:@"name"];        self.gender = [aDecoder decodeObjectForKey:@"gender"];        self.age = [[aDecoder decodeObjectForKey:@"age"] integerValue];    }    return self;}@end

歸檔 / 反歸檔

- (void)archiver {        //把復雜文件寫入文件,先轉化為nsdata對象    //歸檔:歸檔的實質就是把其他類型的數據(person),先轉化為NSData,再寫入文件。    Person *person = [[Person alloc] initWithName:@"rose" gender:@"girl" age:25];    //    NSKeyedArchiver  壓縮工具類,繼承自NSCoder,主要用于編碼    NSMutableData *data = [NSMutableData data] ;    NSKeyedArchiver *achiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];    //使用壓縮工具講Person壓到data中    [achiver encodeObject:person forKey:@"person"];    //完成壓縮,停掉壓縮工具    [achiver finishEncoding];        NSString *homePath = NSHomeDirectory();    NSString *toPath = [homePath stringByAppendingPathComponent:@"person.txt"];    BOOL isSuccess = [data writeToFile:toPath atomically:YES];    NSLog(@"%@",isSuccess ? @"成功" : @"失敗");        //復雜對象的讀取,反歸檔    //    NSKeyedUnarchiver    NSData *getData = [NSData dataWithContentsOfFile:toPath];    NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:getData];    //解壓    Person *p1 = [unArchiver decodeObjectForKey:@"person"];    [unArchiver finishDecoding];}
 //集合NSArray NSDictionary 如果想進行歸檔和反歸檔,那么它里邊存儲的元素也要遵循NSCoding協議    Person *person1 = [[Person alloc] initWithName:@"jack" gender:@"" age:20];    Person *person2 = [[Person alloc] initWithName:@"rose" gender:@"" age:20];    NSArray *array = @[person1,person2];        NSMutableData *data = [NSMutableData data];        NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];    [archiver encodeObject:array forKey:@"array"];    [archiver finishEncoding];        NSString *tmpPath = NSTemporaryDirectory();    NSString *toPath = [tmpPath stringByAppendingString:@"array.txt"];        BOOL isSuccess = [data writeToFile:toPath atomically:YES];    NSLog(@"%@",isSuccess ? @"成功" : @"失敗");    //反歸檔    NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];    NSArray *unArchiverArray = [unArchiver decodeObjectForKey:@"array"];

 

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国内久久久精品| 在线播放日韩欧美| 日韩在线观看免费| 国内精品国产三级国产在线专| 国产不卡在线观看| 国产精品视频久久久久| 精品成人在线视频| 久久777国产线看观看精品| 69视频在线播放| 久久天天躁狠狠躁夜夜躁2014| 日韩一区二区三区xxxx| 国产99视频精品免视看7| 色婷婷亚洲mv天堂mv在影片| 性欧美暴力猛交69hd| 国内免费久久久久久久久久久| 久久久久国产一区二区三区| 亚洲欧美中文日韩v在线观看| 97视频在线观看播放| 日日狠狠久久偷偷四色综合免费| 亚洲国产毛片完整版| 色婷婷综合成人| 奇米成人av国产一区二区三区| 欧美极品第一页| 欧美日韩国产中文字幕| 亚洲精品99999| 国产欧美日韩中文字幕| 国产99久久精品一区二区 夜夜躁日日躁| 最近2019好看的中文字幕免费| 国产精品嫩草影院久久久| 精品久久久精品| 日韩中文字幕视频在线| 最新国产精品亚洲| 国产亚洲一区精品| 久久777国产线看观看精品| 日韩av网址在线观看| 亚洲护士老师的毛茸茸最新章节| 欧美在线www| 午夜精品福利在线观看| 国产欧美一区二区白浆黑人| 国产精品一二区| 性欧美xxxx视频在线观看| 久久久精品国产网站| 日韩在线观看免费高清| 欧美日韩成人在线观看| 91福利视频网| 日韩av在线网站| 欧美香蕉大胸在线视频观看| 欧美日韩激情美女| 亚洲免费视频网站| 国内免费精品永久在线视频| 91av福利视频| 国产精品自在线| 91色琪琪电影亚洲精品久久| 琪琪亚洲精品午夜在线| 国产精品自产拍在线观看| 日韩精品有码在线观看| 91系列在线观看| 成人免费视频网| 国产精品免费网站| 日韩av在线网站| 欧美精品在线免费| 国产精品久久久久av免费| 国产精品白嫩美女在线观看| 日韩在线视频网站| 一个人www欧美| 91亚洲精品久久久久久久久久久久| 这里只有精品视频在线| 成人网在线观看| 欧美日韩免费在线观看| 国产精品美女免费视频| 日韩高清电影免费观看完整| 国产精品一区二区久久久久| 浅井舞香一区二区| 国产精品va在线播放| 伊人久久免费视频| 欧美福利视频在线| www.久久草.com| 狠狠躁夜夜躁人人爽超碰91| www国产精品视频| 91超碰caoporn97人人| 欧美性xxxx极品hd欧美风情| 欧美日韩精品中文字幕| 久久免费成人精品视频| 97久久精品人搡人人玩| 国产丝袜高跟一区| 中文字幕自拍vr一区二区三区| 久久久久久久成人| 国产成人97精品免费看片| 国产精品一香蕉国产线看观看| 成人免费视频网| 亚洲成人久久一区| 久久亚洲国产成人| 亚洲女成人图区| 91系列在线观看| 国产拍精品一二三| 亚洲嫩模很污视频| 国产中文字幕91| 亚洲自拍偷拍网址| 精品无人区乱码1区2区3区在线| 久久综合免费视频影院| 亚洲人成伊人成综合网久久久| 欧美日韩电影在线观看| 国产国语videosex另类| 国产91免费观看| 激情av一区二区| 日韩成人免费视频| 欧美日本黄视频| 91免费的视频在线播放| 成人福利视频网| 91av视频在线| 欧美日韩亚洲激情| 中文字幕视频在线免费欧美日韩综合在线看| 亚洲xxxxx电影| 超碰精品一区二区三区乱码| 色综合久久中文字幕综合网小说| 成人免费xxxxx在线观看| 国产精品一区二区三区久久久| 国产精品电影在线观看| 亚洲自拍av在线| 久久九九国产精品怡红院| 亚洲社区在线观看| 亚洲色图综合网| 日本三级久久久| 欧美日韩美女在线观看| 亚洲性线免费观看视频成熟| 色噜噜狠狠狠综合曰曰曰88av| 欧美成人性生活| 欧美福利视频在线观看| 日韩欧美aⅴ综合网站发布| 欧美另类极品videosbestfree| 国产精品男人爽免费视频1| 亚洲国产高清自拍| 7777精品久久久久久| 久久久亚洲网站| 欧美成人精品一区二区三区| 欧美激情免费观看| 98精品在线视频| 久久全球大尺度高清视频| 精品五月天久久| 8090成年在线看片午夜| 亚洲精选中文字幕| 亚洲第一区在线观看| www国产精品视频| 亚洲肉体裸体xxxx137| 日韩最新av在线| 一区二区三区视频观看| 欧美巨乳在线观看| 国产激情久久久| 欧美日韩国产麻豆| 中文字幕欧美日韩| 国产精品久久久久久久久久久久久| 久久久www成人免费精品张筱雨| 欧洲成人免费视频| 亚洲自拍偷拍色片视频| 久久久在线视频| 亚洲视频在线免费看| 亚洲一区二区三区777| 国产一区二区日韩精品欧美精品| 亚洲日本中文字幕免费在线不卡| 国产亚洲视频中文字幕视频| 最近中文字幕2019免费| 久久综合久久美利坚合众国| 深夜福利亚洲导航| 久久久久久久久国产|