天天看點

NSUserDefaults(資料存儲)

NSUserDefaults(資料存儲)

NSUserDefaults适合存儲輕量級的本地資料,比如要儲存一個登陸界面的資料,使用者名、密碼之類的,個人覺得使用NSUserDefaults是首選。下次再登陸的時候就可以直接從NSUserDefaults裡面讀取上次登陸的資訊咯。

因為如果使用自己建立的plist檔案什麼的,還得自己顯示建立檔案,讀取檔案,很麻煩,而是用NSUserDefaults則不用管這些東西,就像讀字元串一樣,直接讀取就可以了。

NSUserDefaults支援的資料格式有:NSNumber(Integer、Float、Double),NSString,NSDate,NSArray,NSDictionary,BOOL類型。很實用吧

NSUserDefaults很友善,讀取也很容易。下面給出一個示例看看如何使用:(PS:更詳細的也可以參考官方文檔哈)

ViewController.h檔案中主要是放幾個控件,用于顯示存儲的資料:

#import <UIKit/UIKit.h>  

@interface ViewController : UIViewController  

{  

    IBOutlet UILabel *txtInteger;  

    IBOutlet UILabel *txtFloat;  

    IBOutlet UILabel *txtDouble;  

    IBOutlet UILabel *txtNSString;  

    IBOutlet UILabel *txtNSDate;  

    IBOutlet UILabel *txtNSArray;  

    IBOutlet UILabel *txtNSDictionary;  

}  

@end  

ViewController.m檔案中最重要的是兩個方法:

saveNSUserDefaults:用于将各種類型資料儲存到NSUserDefaults中

readNSUserDefautls:用于從NSUserDefaults中讀取各種類型的資料。在viewDidLoad中調用這兩個方法就可以看出結果咯

#import "ViewController.h"  

@interface ViewController ()  

@implementation ViewController  

- (void)viewDidLoad  

    [super viewDidLoad];  

    [self saveNSUserDefaults];  //調用此方法将各種資料存儲到NSUserDefautls中,在下面定義  

    [self readNSUserDefaults];  //調用此方法從NSUserDefautls中讀取各種資料,在下面定義  

- (void)viewDidUnload  

    [txtNSString release];  

    txtNSString = nil;  

    [txtNSDate release];  

    txtNSDate = nil;  

    [txtNSArray release];  

    txtNSArray = nil;  

    [txtNSDictionary release];  

    txtNSDictionary = nil;  

    [txtInteger release];  

    txtInteger = nil;  

    [txtFloat release];  

    txtFloat = nil;  

    [txtDouble release];  

    txtDouble = nil;  

    [super viewDidUnload];  

    // Release any retained subviews of the main view.  

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation  

    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);  

- (void)dealloc {  

    [super dealloc];  

//儲存資料到NSUserDefaults  

-(void)saveNSUserDefaults  

    NSString *myString = @"enuola";  

    int myInteger = 100;  

    float myFloat = 50.0f;  

    double myDouble = 20.0;  

    NSDate *myDate = [NSDate date];  

    NSArray *myArray = [NSArray arrayWithObjects:@"hello", @"world", nil];  

    NSDictionary *myDictionary = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"enuo", @"20", nil] forKeys:[NSArray arrayWithObjects:@"name", @"age", nil]];  

    //将上述資料全部存儲到NSUserDefaults中  

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];  

    //存儲時,除NSNumber類型使用對應的類型意外,其他的都是使用setObject:forKey:  

    [userDefaults setInteger:myInteger forKey:@"myInteger"];  

    [userDefaults setFloat:myFloat forKey:@"myFloat"];  

    [userDefaults setDouble:myDouble forKey:@"myDouble"];  

    [userDefaults setObject:myString forKey:@"myString"];  

    [userDefaults setObject:myDate forKey:@"myDate"];  

    [userDefaults setObject:myArray forKey:@"myArray"];  

    [userDefaults setObject:myDictionary forKey:@"myDictionary"];  

    //這裡建議同步存儲到磁盤中,但是不是必須的  

    [userDefaults synchronize];  

//從NSUserDefaults中讀取資料  

-(void)readNSUserDefaults  

    NSUserDefaults *userDefaultes = [NSUserDefaults standardUserDefaults];  

    //讀取資料到各個label中  

    //讀取整型int類型的資料  

    NSInteger myInteger = [userDefaultes integerForKey:@"myInteger"];  

    txtInteger.text = [NSString stringWithFormat:@"%d",myInteger];  

    //讀取浮點型float類型的資料  

    float myFloat = [userDefaultes floatForKey:@"myFloat"];  

    txtFloat.text = [NSString stringWithFormat:@"%f",myFloat];  

    //讀取double類型的資料  

    double myDouble = [userDefaultes doubleForKey:@"myDouble"];  

    txtDouble.text = [NSString stringWithFormat:@"%f",myDouble];  

    //讀取NSString類型的資料  

    NSString *myString = [userDefaultes stringForKey:@"myString"];  

    txtNSString.text = myString;  

    //讀取NSDate日期類型的資料  

    NSDate *myDate = [userDefaultes valueForKey:@"myDate"];  

    NSDateFormatter *df = [[NSDateFormatter alloc] init];  

    [df setDateFormat:@"yyyy-MM-dd HH:mm:ss"];  

    txtNSDate.text = [NSString stringWithFormat:@"%@",[df stringFromDate:myDate]];  

    //讀取數組NSArray類型的資料  

    NSArray *myArray = [userDefaultes arrayForKey:@"myArray"];  

    NSString *myArrayString = [[NSString alloc] init];  

    for(NSString *str in myArray)  

    {  

        NSLog(@"str= %@",str);  

        myArrayString = [NSString stringWithFormat:@"%@  %@", myArrayString, str];  

        [myArrayString stringByAppendingString:str];  

//        [myArrayString stringByAppendingFormat:@"%@",str];  

        NSLog(@"myArrayString=%@",myArrayString);  

    }  

    txtNSArray.text = myArrayString;  

    //讀取字典類型NSDictionary類型的資料  

    NSDictionary *myDictionary = [userDefaultes dictionaryForKey:@"myDictionary"];  

    NSString *myDicString = [NSString stringWithFormat:@"name:%@, age:%d",[myDictionary valueForKey:@"name"], [[myDictionary valueForKey:@"age"] integerValue]];  

    txtNSDictionary.text = myDicString;  

好了,運作一下,可以看到xib檔案中的各種資料已經綁定上了吧?

再次運作的時候,可以把viewDidLoad中的  [self  saveNSUserDefaults];  這一行注釋掉,讓程式直接讀取而不存儲資料,發現以前儲存的資料仍然可以讀取到界面上。

嘻嘻,很簡單吧,就這樣就可以是實作資料的存儲了。

下面講一下原理:

你可能會問一個問題:NSUserDefautls将資料存儲在什麼地方了???我都沒有顯示的指定路徑???很疑惑吧。。。。

用NSUserDefaults存儲的資料下次程式運作的時候依然存在,它把資料存儲在什麼地方了?如何能夠清除?

其實它存儲在應用程式内置的一個plist檔案裡,這個可以根據路徑看到。

比如說這個是你的程式沙盒位置

/UsersLibrary/Application Support/iPhoneSimulator/4.1/Applicati*****/29788E40-AF47-45A0-8E92-3AC0F501B7F4/,(這個是應用程式對應在mac上的位置)

這個下面有/Library/Prefereces,裡面有個plist檔案,存儲的就是你的userDefaults

想要删掉的話,用removeObjectForKey或者删掉沙盒,也就是你的應用程式然後重新安裝。

繼續閱讀