plist文件、NSUserDefault 對文件進行存儲的類、json格式解析

来源:http://www.cnblogs.com/ljcgood66/archive/2016/03/26/5321882.html
-Advertisement-
Play Games

文件操作 Δ一 .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格式進行校驗並規整。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • JavaScript的 DOM操作,主要是對DOM這三個字母中D、O、M的操作。D代表的是document(文檔),即我們可以使用javascript對文檔進行操作,O代表的是object(對象),對象包括用戶自定義對象,內建對象和宿主對象,這裡不再贅述,M代表的是model(模型),今天我們主要講 ...
  • 1 <!doctype html> 2 <html> 3 4 <head> 5 <meta charset="utf-8"> 6 <title>Baymax</title> 7 8 <style> 9 body { 10 background: #595959; 11 } 12 13 #baymax ...
  • 引言 web應用中有很多地方會用到打點,用來檢測用戶行為,今天就做了個打點相關的需求,為了統計一個廣告給用戶的展示次數,每次用戶請求完成並且渲染完成之後就算一次成功的展示,其實有時候這個廣告還沒有在用戶的可視範圍之內,用戶需要滑動滾動條才能看見,但已經算了一次成功展示了,顯然這裡不太合理,這裡做了個 ...
  • 備註 html 效果圖 ...
  • 一、應用場景 滑鼠hover彈出div,並且滑鼠離開後不能馬上隱藏,因為這個div上還有功能入口。比如: 滑鼠經過好友列表中的好友頭像時顯示資料卡的效果 hover時顯示二維碼 二、實現 用如下這樣一個簡單的效果:滑鼠hover到A上顯示B來模擬 有2種實現方式,推薦第二種,第一種有弊端下麵會說。 ...
  • why 在開發中我們可能需要改變這一行為,一般基於2種理由: how 筆者所知道的主要有3種方式,下麵我們就一個個來看看。 通過theme/style來修改,代碼如下: 修改windowAnimationStyle的方式 修改windowAnimationStyle的方式 但是實際測試發現,不論是改 ...
  • *owner在開發中現在已經很少用了 有興趣的童鞋可以看看* 我們遇到owner通常是在類似 [[[NSBundle mainBundle] loadNibNamed:@"Food" owner:nil options:nil]lastObject ]中遇到的。 我們一般的做法是直接把owner設置 ...
  • GCD 是iOS多線程實現方案之一,非常常用 英文翻譯過來就是偉大的中樞調度器,也有人戲稱為是牛逼的中樞調度器 是蘋果公司為多核的並行運算提出的解決方案 1.一次性函數 dispatch_once 顧名思義是只執行一次的函數,註意是整個程式中只執行一次(單例模式常用到) 2.柵欄函數 dispatc ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...