天天看點

NSUserDefaults 簡介,使用 NSUserDefaults 存儲自定義對象一、了解NSUserDefaults以及它可以直接存儲的類型二、使用 NSUserDefaults 存儲自定義對象

摘要: NSUserDefaults适合存儲輕量級的本地資料,一些簡單的資料(NSString類型的)例如密碼,網址等,NSUserDefaults肯定是首選,但是如果我們自定義了一個對象,對象儲存的是一些資訊,這時候就不能直接存儲到NSUserDefaults了

一、了解NSUserDefaults以及它可以直接存儲的類型

      NSUserDefaults是一個單例,在整個程式中隻有一個執行個體對象,他可以用于資料的永久儲存,而且簡單實用,這是它可以讓資料自由傳遞的一個前提,也是大家喜歡用它儲存簡單資料的一個主要原因。 

      使用 NSUserDefaults 存儲自定義對象的最初,我們必須認識NSUserDefaults可以存儲哪一些類型的資料,下面一一列出:

NSUserDefaults支援的資料類型有:NSNumber(NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL.

        如果想要将上述資料類型的資料永久儲存到NSUserDefaults中去,隻需要簡單的操作(一個Value 一個Key ),例如,想要儲存一個NSString的對象,代碼實作為:

    //将NSString 對象存儲到 NSUserDefaults 中
    NSString *passWord = @"1234567";
    NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
    [user setObject:passWord forKey:@"userPassWord"];           

    将資料取出也很簡單,隻需要取出key 對應的值就好了,代碼如下:

    NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
    NSString *passWord = [ user objectForKey:@"userPassWord"];           

注意:對相同的Key指派約等于一次覆寫,要保證每一個Key的唯一性

值得注意的是:

        NSUserDefaults 存儲的對象全是不可變的(這一點非常關鍵,弄錯的話程式會出bug),例如,如果我想要存儲一個 NSMutableArray

對象,我必須先建立一個不可變數組(NSArray)再将它存入NSUserDefaults中去,代碼如下:

    NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"123",@"234", nil];
    NSArray * array = [NSArray arrayWithArray:mutableArray];
    
    NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
    [user setObject:array forKey:@"記住存放的一定是不可變的"];           

取出資料是一樣的,想要用NSUserDefaults中的資料給可變數組指派

先給出一個錯誤的寫法:

    /*-------------------------錯誤的指派方法-------------------*/
    NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
    
    //這樣寫後,mutableArray 就變成了不可變數組了,如果你要在數組中添加或删除資料就會出現bug
    NSMutableArray *mutableArray = [user objectForKey:@"記住存放的一定是不可變的"];           

正确的寫法:

    /*-------------------------正确的指派方法-------------------*/
    NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
    
    //可以用alloc 方法代替
    NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:[user objectForKey:@"記住存放的一定是不可變的"]];           

二、使用 NSUserDefaults 存儲自定義對象

1、将自定義類型轉換為NSData類型

      當資料重複而且多的時候(例如想存儲全班同學的學号,姓名,性别(這個資料量可能太大了 )),如果不用SQLite 存儲 (多資料最好還是用這個),你可以選擇使用歸檔,再将檔案寫入本地,但是這種方式和 NSUserDefaults 比起來麻煩多了(因為NSFileManage

本來就挺複雜) ,但是問題是,NSUserDefaults 本身不支援自定義對象的存儲,不過它支援NSData的類型,下面舉一個例子來介紹。

我們先建立一個叫Student 的類,這個類裡有三個屬性(學号,姓名,性别),如圖:

NSUserDefaults 簡介,使用 NSUserDefaults 存儲自定義對象一、了解NSUserDefaults以及它可以直接存儲的類型二、使用 NSUserDefaults 存儲自定義對象

我們要做的就是将Student類型變成NSData類型 ,那麼就必須實作歸檔:

這裡要實作 在.h 檔案中申明 NSCoding 協定,再 在 .m 中實作 encodeWithCoder 方法

和 

initWithCoder 方法就可以了 : 

.h 中修改檔案如圖 :

NSUserDefaults 簡介,使用 NSUserDefaults 存儲自定義對象一、了解NSUserDefaults以及它可以直接存儲的類型二、使用 NSUserDefaults 存儲自定義對象

.m中加入代碼 :

NSUserDefaults 簡介,使用 NSUserDefaults 存儲自定義對象一、了解NSUserDefaults以及它可以直接存儲的類型二、使用 NSUserDefaults 存儲自定義對象

這樣做就可以将自定義類型轉變為NSData類型了

2、将自定義類型資料存入 NSUserDefaults 中

    如果要存儲全班同學的資訊,我們可以建一個NSMutableArray 來存放全班同學的資訊(裡面存儲的全是NSData對象)在需要存儲的地方加入代碼:

//首先,要建立一個可變數組來存儲 NSDate對象

     Student *student = [[Student alloc] ini];
     
    //下面進行的是對student對象的 name , studentNumber ,sex 的指派
    student.name = @"lady-奕奕";
    student.studentNumber = @"3100104006";
    student.sex = @"女";
    
    //這是一個存放全班同學的數組
    NSMutableArray * dataArray = [NSMutableArray arrayWithCapacity:50];
    
    //将student類型變為NSData類型
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:student];
    
    //存放資料的數組将data加入進去
    [dataArray addObject:data];           

如果你隻想存一個人的資訊,你可以直接将NSData存入NSUserDefaults中 :

    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:student];   
    
    NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
    [user setObject:data forKey:@"oneStudent"];           

如果你想存儲全班同學的資訊,你還要用一個for循環将data 放入 dataArray中,這裡具體的操作就不實作了,隻給出存放的代碼:

   //記住要轉換成不可變數組類型
    NSArray * array = [NSArray arrayWithArray:dataArray];
    
    NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
    [user setObject:array forKey:@"allStudent"];           

從NSUserDefaults中取出資料在還原也很簡單

例如還原一個學生的資料:

NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
 
 NSdData *data = [user objectForKey:@"oneStudent"];
    
 Student *student = [NSKeyedUnarchiver unarchiveObjectWithData:data];           

總之,NSUserDefaults 在我們編寫代碼中是最常用的一個永久儲存資料的方法,也是最簡單的。