開發(fā)中會(huì)遇到一些數(shù)據(jù)的存儲(chǔ),有些人可能會(huì)說了,前段開發(fā)不需要什么數(shù)據(jù)存儲(chǔ),應(yīng)該交給后臺(tái)來(lái)做,我們只需要跟后臺(tái)進(jìn)行交互就好了,但是一些輕量級(jí)的數(shù)據(jù),還是需要我們自己來(lái)存儲(chǔ)的,比如登錄狀態(tài),登錄成功后的一些常用數(shù)據(jù):userID,userName,headViewUrl,電話號(hào)碼啊等等,一些操作需要用到的數(shù)據(jù),都是需要我們來(lái)進(jìn)行存儲(chǔ)的,這樣可以減少一些服務(wù)器壓力,設(shè)想一下,如果所有的信息都需要網(wǎng)絡(luò)請(qǐng)求,拂去其壓力該的多大。好了,廢話不多說,我們來(lái)說說,iOS開發(fā)中的數(shù)據(jù)存儲(chǔ)。
iOS開發(fā)中遇到一些輕量級(jí)的數(shù)據(jù),通常是由我們存儲(chǔ)到本地的。常用到的數(shù)據(jù)存儲(chǔ)(這里統(tǒng)統(tǒng)指的是輕量級(jí)數(shù)據(jù))的方式一般有:NSUserDefault、Keychain、Plist、CoreData、FMDB、歸檔等方式。比如用戶ID,登錄狀態(tài)、username等不是隱私性特別強(qiáng)的話,一般都會(huì)用NSUserDefault,比如電話號(hào)碼之類稍微有點(diǎn)關(guān)于用戶隱私的用KeyChain存儲(chǔ),等等。每種方式都有每種方式的特點(diǎn),這里我們說一下plist存儲(chǔ)。
應(yīng)用場(chǎng)景:這兩天在做一個(gè)應(yīng)用,其中有這樣一個(gè)場(chǎng)景是,我們要存儲(chǔ)多條數(shù)據(jù),這多條數(shù)據(jù)key值相同,每次存儲(chǔ)不能覆蓋。剛一開始我想用NSUserDefault來(lái)做,但是好像不太符合NSUserDefault存儲(chǔ)的特點(diǎn),不是很方便,因?yàn)樾枨笥悬c(diǎn)類似于數(shù)據(jù)庫(kù)中的表。所以就想到了plist來(lái)做。
plist文件可以手動(dòng)創(chuàng)建也可以代碼創(chuàng)建,我這里是代碼創(chuàng)建的,因?yàn)槲乙獎(jiǎng)討B(tài)的修改plist,類似于數(shù)據(jù)庫(kù)中的增刪改查。如果你已經(jīng)有了固定的數(shù)據(jù),可以xcode種創(chuàng)建plist,然后添加你的數(shù)據(jù),在需要的地方進(jìn)行讀取,我這邊因?yàn)閿?shù)據(jù)不固定,所以用代碼的方式創(chuàng)建。
1)在你需要添加數(shù)據(jù)的地方寫:
NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath = [path objectAtIndex:0];
NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"notes.plist"];
我這邊是字典的方式存儲(chǔ)多條數(shù)據(jù),所以,先用字典存儲(chǔ),然后將字典放到數(shù)組中,將數(shù)組寫入plist文件,這樣就可以保證多條存儲(chǔ),存儲(chǔ)的數(shù)據(jù)也不會(huì)將上一條數(shù)據(jù)覆蓋。
//賦值
NSMutableDictionary * newsDict = [NSMutableDictionary dictionary];
[newsDict setObject:self.titleFiled.text forKey:@"title"];
[newsDict setObject:self.notestextView.text forKey:@"notes"];
[newsDict setObject:[NSString currtenDate] forKey:@"date"];
[self.notesDatas addObject:newsDict];
//數(shù)據(jù)寫入plist
[self.notesDatas writeToFile:plistPath atomically:YES];這里將數(shù)組寫入了文件。
之后你會(huì)發(fā)現(xiàn)一個(gè)問題,在當(dāng)前界面操作時(shí)沒有問題,去別的界面讀數(shù)據(jù)也沒問題,但是,在重新返回本界面做寫入操作時(shí),你會(huì)發(fā)現(xiàn)這次上次寫入的數(shù)據(jù)沒有了。原因時(shí),這邊的數(shù)組每次走都進(jìn)行了初始化。所以每次都是一個(gè)全新的數(shù)組,但是初始化還不能省略。解決辦法是什么呢?
2)我每次這進(jìn)入這個(gè)界面時(shí)先將文件中的數(shù)據(jù)全部取出來(lái),放到self.notesDatas這個(gè)數(shù)組中,然后寫入時(shí)就會(huì)將所有的數(shù)據(jù)寫入了。
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.navigationItem.title = @"Add";
//下面是讀取數(shù)據(jù)
NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path1 = [pathArray objectAtIndex:0];
NSString *myPath = [path1 stringByAppendingPathComponent:@"notes.plist"];
NSMutableArray*data2 = [[NSMutableArray alloc] initWithContentsOfFile:myPath];
self.notesDatas = [NSMutableArray array];
if (data2.count) {
[self.notesDatas addObjectsFromArray:data2];
}
[self createUI];
}
3)展示數(shù)據(jù)
兩一個(gè)控制器內(nèi)用tableview展示存儲(chǔ)的數(shù)據(jù),這里的操作跟上一步取數(shù)據(jù)是一樣的,如果存的字典,就用字典接收,如果是數(shù)組就用數(shù)組接受,這里附上代碼,需求不同代碼也不同,所以只是參考,按照自己的需求改變。
-(void)viewWillAppear:(BOOL)animated{
NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path1 = [pathArray objectAtIndex:0];
NSString *myPath = [path1 stringByAppendingPathComponent:@"notes.plist"];
NSMutableArray*data2 = [[NSMutableArray alloc] initWithContentsOfFile:myPath];
self.notesDatas = [NSMutableArray array];
[self.notesDatas addObjectsFromArray:data2];
[self.tableView removeFromSuperview];
[self.imageVIew removeFromSuperview];
if (data2.count) {
[self createTableview];
}else{
[self createimgeView];
}
}