文件操作 Δ一 .plist文件 .plist文件是一個屬性字典數組的一個文件; .plist文件可以用來存儲:字典、數組、字元串等對象數據,可以混搭存儲 【註】iOS開發中,plist文件一般用於app的配置信息 【註】ios開發工程中,允許多個plist文件共存。 【註】plist文件用來存儲小 ...
==========================
文件操作
==========================
Δ一 .plist文件
.plist文件是一個屬性字典數組的一個文件;
.plist文件可以用來存儲:字典、數組、字元串等對象數據,可以混搭存儲
【註】iOS開發中,plist文件一般用於app的配置信息
【註】ios開發工程中,允許多個plist文件共存。
【註】plist文件用來存儲小數據量的數據
優點:可視化以及可編輯性非常方便
plist文件的操作
// 例如
NSString* str = @"我是\"美國人\"\n,我愛\"美國\"";
NSLog(@"%@",str);
1.創建plist文件
NSMutableDictionary* dic = [[NSMutableDictionary alloc]init];
[dic setObject: @"張三" forKey: @"name"];
[dic setObject: @"李四" forKey: @"name1"];
[dic setObject: @"王二" forKey: @"name2"];
//【註】如果key相同,數據會被衝掉
[dic setObject: @"zhangsan" forKey: @"name"];
// 把數據寫入文件
//【瞭解】atomically
// atomically:參數意思,原子操作
// 如果atomically的參數是yes,程式會把數據先備份一下,等全部寫入到了緩存中再一次性寫入文件
// 如果atomically的參數是no,程式會直接把數據寫入緩存
[dic writeToFile:Path atomically:YES];
2.創建一種多鍵值的plist文件
NSMutableDictionary* plugin1 = [[NSMutableDictionary alloc]init];
[plugin1 setObject: @"張三1" forKey: @"name1"];
[plugin1 setObject: @"李四" forKey: @"name2"];
NSMutableDictionary* plugin2 = [[NSMutableDictionary alloc]init];
[plugin2 setObject: @"王二" forKey: @"name1"];
[plugin2 setObject: @"趙五" forKey: @"name2"];
NSMutableDictionary* listDic = [[NSMutableDictionary alloc]init];
[listDic setObject:plugin1 forKey: @"初中一班"];
[listDic setObject:plugin2 forKey: @"初中二班"];
[listDic setObject: @"一哥" forKey: @"name"];
[listDic writeToFile:Path atomically:YES];
3.對某一個屬性進行修改
//∆∆∆∆首先應該先讀取當前plist文件,讀出所有數據
// 讀取指定目錄下的文件內容
NSMutableDictionary* appList = [[NSMutableDictionary alloc]initWithContentsOfFile:Path];
[appList setObject: @"二哥" forKey: @"name"];
NSMutableDictionary* chu1 = [appList objectForKey: @"初中一班"];
NSString* name1 = [chu1 objectForKey: @"name1"];
[[appList objectForKey: @"初中一班"] objectForKey: @"name1"];
// 通過取出的內容,重新組合一個新的內容,把新的內容數據重新存入plist中
[chu1 setObject:@"qianfeng" forKey: @"name1"];
[appList setObject:chu1 forKey: @"初中一班"];
[appList writeToFile:Path atomically:YES];
【總結】
1.plist文件操作其實就是一個根目錄是字典,內部數據各種嵌套操作。
2.如果想要修改plist中的某個欄位內容,一層一層去找,找到後一層一層封裝回來,重新寫入文件。(文件的覆蓋過程)
3.plist不允許出現key值重名,如果重名,會把之前的名稱下的值給衝掉。
二.NSUserDefault 對文件進行存儲的類
1. NSUserDefault是一個本地數據存儲類,可以存儲小數據量的信息。
2. NSUserDefault 在iOS中常用來存儲用戶的個人信息,以及登陸註冊信息。
【註】到目前為止,大家所學的歸檔、寫文件、NSUserDefault都是存儲小數據量信息的類,他們可以存儲大數據量但是會出現性能問題。存儲大數據量信息用【資料庫】
【資料庫】
1.SQlite 底層的數據,需要自己手動去創建資料庫文件(db),並且需要手動去書寫sqlite 語句;
2.【core data】是蘋果公司提供的一種資料庫存儲、查詢、修改、刪除等操作一種解決方案;core data資料庫其實就是一個對sqlit3進行封裝的類庫。
3.第三方資料庫。
Δ【學習NSUserDefault】
// userDefault Demo
// NSUserDefaults 是一個單例類,調用單例方法
NSUserDefaults* defaul = [NSUserDefaults standardUserDefaults];
// 設置key和value
[defaul setObject: @"15588605664" forKey: @"userName"];
[defaul setObject: @"123456" forKey: @"password"];
NSArray* classInfo = @[@"初中一班", @"66個同學", @"平均成績99.98", @{@"key":@"value"}];
[defaul setObject:classInfo forKey: @"clss_Info"];
[defaul setObject: @"1" forKey: @"status"];
[defaul setBool:YES forKey: @"status"];
[defaul setInteger:1 forKey: @"int"];
[defaul setObject:[NSNumber numberWithBool:YES] forKey: @"status1"];
[defaul setFloat:0.15 forKey: @"float"];
// 把剛纔設置的內容存儲到程式給NSUserDefaults所分配的空間文件中
// 系統會把NSUserDefaults存儲的文件都放到app的一個指定的目錄,其實這個目錄就是在根目錄的library目錄下一個新的目錄下
// ∆∆∆∆[註]synchronize 一定要寫這個方法,可以確保數據萬無一失,如果不寫這個方法,可能會存在數據沒有保存成功的情況,例如在多線程中進行數據保存;
[defaul synchronize];
// =================================
// 讀取文件的方式
NSString* userName = [defaul objectForKey: @"userName"];
NSString* pwd = [defaul objectForKey: @"password"];
// 只要是牽扯到key和value的,那麼存儲的時候key怎麼寫,取的時候,key必須怎麼寫
// 只要是牽扯到key和value的,那麼存儲的key如果一樣,肯定會發生覆蓋
NSArray* ClassAllInfo = [defaul objectForKey: @"clss_Info"];
BOOL isok = [defaul objectForKey: @"status"];
float f1 = [defaul floatForKey: @"float"];
NSInteger i = [defaul integerForKey: @"int"];
BOOL b = [defaul boolForKey: @"status"];
NSLog(@"用戶的登陸信息是:\n%@\n%@", userName, pwd);
NSLog(@"%@",ClassAllInfo);
【註】NSUserDefault 可以存儲的數據類型有:NSNumber(NSInterger、flost、double),NSDictionary,NSArray、Bool,NSString這些數據類型
Δ.【擴展知識— c語言 轉義字元】
轉義字元就是用來解決程式中的一些特殊符號導致編碼出錯的問題。比如:
【註】對要進行轉義的字元每個前面都要寫 \
1.‘
2.“
3. 回車
4.等等非常多
【擴展】
1.編程中文件的命名最好不要有中文、空格、特殊符號(因為電腦會對中文或者空格或者特殊符號進行轉義)
2.文件和記憶體數據之間的轉換關係
cpu(電腦處理數據大腦)所有的數據都是按照cpu的指令去調度執行
本地文件——>記憶體 (讀的過程)
記憶體 ——>本地文件 (寫的過程)
【註】代碼中定義的變數或者對象變數,這些變數的內容都是在記憶體中存儲運算。如果想把一些有用的信息永久保留,就需要把信息保存到文件中。
(1).記憶體中的數據,都是一些臨時數據,當電腦發生意外情況(斷電),記憶體中的數據都會消失;
(2).把記憶體中的輸入寫入到文件中,就可以永久保存,只要文件沒有被刪除。
三.json格式解析
1.json
2.xml
【比較】xml格式出現的比json格式早,xml就是表單(表格)(<body>name</body>),xml最致命的缺點就是可閱讀性不高,導致程式員解析比較麻煩。xml優點是應用到大數據量。但是,隨著移動端的興起,json這種格式也開始流行。逐漸成為ios平臺和安卓平臺app端獲取數據一種格式。json格式優點:格式清晰,應用於小數據量的獲取。
// 例如
#import <Foundation/Foundation.h>
#import "MyModel.h"
#import "UserModel.h"
#define PATH @"http://m2.qiushibaike.com/article/list/latest?page=1&count=30&rqcnt=21&r=a1ef5f561429944164282"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 協議很多種:http ftp mail file socket xmpp
// url格式: 協議://功能變數名稱(ip地址):埠/路徑 ?參數列表(以&符間隔每個參數)
// 將字元串轉換成NSURL類型
NSURL *url = [NSURL URLWithString:PATH];
// 通過url獲取數據
// NSData *data1 = [[NSData alloc] initWithContentsOfFile: @""];
NSData *data = [[NSData alloc] initWithContentsOfURL:url];
// NSLog(@"%@",data);
NSError *error = nil;
// NSJSONSerialization蘋果系統自帶解析,此方法是把data解析成NSDictionary 操作讀取可變內容
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
if (error) {
NSLog(@"解析失敗");
exit(-1);
}
NSLog(@"%@",dic);
NSArray *array = [dic objectForKey:@"items"];
// NSLog(@"%@",array);
// 創建一個可變數組用於存放myModel這個模型
NSMutableArray *dataArray = [[NSMutableArray alloc] init];
for (int i = 0; i < array.count; i++) {
MyModel *myModel = [[MyModel alloc] init];
NSDictionary *dicItem = array[i];
// 這裡的key一定要對應url返回來欄位值
myModel.content = [dicItem objectForKey: @"content"];
myModel.modelId = [dicItem objectForKey: @"id"];
if (![[dicItem objectForKey:@"user"] isMemberOfClass:[NSNull class]] ) {
NSDictionary *userDic = [dicItem objectForKey: @"user"];
UserModel *userModel = [[UserModel alloc] init];
// NSLog(@"%@",[userDic objectForKey: @"avatar_updated_at"]);
userModel.avatar_updated_at = [userDic objectForKey: @"avatar_updated_at"];
userModel.created_at = [userDic objectForKey: @"created_at"];
userModel.last_device = [userDic objectForKey: @"last_device"];
myModel.user = userModel;
}
[dataArray addObject:myModel];
}
// NSLog(@"可變數組個數:%lu",dataArray.count);
for (MyModel *myModel in dataArray) {
NSLog(@"content:%@,modelId:%@", myModel.content, myModel.modelId);
UserModel *userModel = myModel.user;
NSLog(@"更新時間:%@,創建時間:%@,最終設備: %@", userModel.avatar_updated_at, userModel.created_at, userModel.last_device);
}
}
return 0;
}
#import <Foundation/Foundation.h>
#import "UserModel.h"
@interface MyModel : NSObject
@property (nonatomic,copy) NSString *content;
@property (nonatomic,copy) NSString *modelId;
@property (nonatomic,strong) UserModel *user;
@end
#import <Foundation/Foundation.h>
@interface UserModel : NSObject
@property (nonatomic,copy) NSString *avatar_updated_at;
@property (nonatomic,copy) NSString *created_at;
@property (nonatomic,copy) NSString *last_device;
@end
【註】可以利用http://www.bejson.com/ 對json格式進行校驗並規整。