IOS-本地存儲-NSUserDefaults – iPhone手機開發技術文章 iPhone軟體開發教學課程

一 NSUserDefaults簡介

NSUserDefaults類提供瞭一個與默認系統進行交互的編程接口。NSUserD
efaults對象是用來保存、恢復應用程序相關的偏好設置、配置數據等等。默認系統允許應用程序自定義它的行為去迎合用戶的喜好。你可以在程序運行的時候從用戶默認的數據庫中讀取程序的設置,同時NSUserDefaults的緩存避免瞭在每次讀取數據時候都打開用戶默認數據庫的操作。可以通過調用synchroni
ze方法來使內存中的緩存與用戶默認系統進行同步。NSUserDefaults類提供瞭非常方便的方法來讀寫常用的類型,常用的方法有:setBool:forKey、setFloat :forKey、setInteger:forKey、setObject:forKey、setDouble:forKey、setURL:forKey,具體使用哪個方法取決於要存儲的數據類型。其中,方法setObject:
forKey用於存儲NSString、NSDate、NSArry、NSDictionary等復合對象類型。

二 實例代碼


NSUserDefaults是單例,同時也是線程安全的。使用方法如下:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

[userDefaults setBool: self.toggleSwitch.on
forKey:kOnOffToggle];

[userDefaults setFloat: self.brightnessSlider.value
forKey:kBrightnessLevel];

註意:上述代碼將數據寫入默認設置數據庫時,並不一定會立即保存這些數據。還需要進一步調用 synchronize 方法確保所有數據都及時寫入:

[userDefaultssynchronize];

要將這些數據讀入 App 中,可根據鍵值和返回類型,調用相應的方法。根據要讀取的數據類型,可選擇 arrayForKey、boolForKey、dateforKey、 dictionaryForKey、 floatForKey、integerForKey、objectForKey、doubleForKey和URLForKey等方法。

NSUserDefaults
*userDefaults = [NSUserDefaults standardUserDefaults];
self.brightnessSlider.value
= [userDefaults floatForKey:kBrightnessLevel];
self.toggleSwitch.on
= [userDefaults boolForKey:kOnOffToggle];

NSUserDefaults適合存儲輕量級的本地數據,比如要保存一個登陸界面的數據,用戶名、密碼之類的,個人覺得使用NSUserDefaults是首選。下次再登陸的時候就可以直接從NSUserDefaults裡面讀取上次登陸的信息。

因為如果使用自己建立的plist文件什麼的,還得自己顯示創建文件,讀取文件,很麻煩,而是用NSUserDefaults則不用管這些東西,就像讀字符串一樣,直接讀取就可以瞭(NSUserDefaults中的數據最終都會存儲到plist屬性列表裡面)。NSUserDefaults支持的數據格式有:NSNumber(Integer、Float、Double),NSString,NSDate,NSArray,NSDictionary,BOOL類型。

NSUserDefaults很方便,讀取也很容易。下面給出一個示例看看如何使用,ViewController.h文件中主要是放幾個控件,用於顯示存儲的數據:

[cpp] view
plaincopy

  1. #import

  2. @interface ViewController : UIViewController

  3. {

  4. IBOutlet UILabel *txtInteger;

  5. IBOutlet UILabel *txtFloat;

  6. IBOutlet UILabel *txtDouble;

  7. IBOutlet UILabel *txtNSString;

  8. IBOutlet UILabel *txtNSDate;

  9. IBOutlet UILabel *txtNSArray;

  10. IBOutlet UILabel *txtNSDictionary;

  11. }

  12. @end

    ViewController.m文件中最重要的是兩個方法:

    saveNSUserDefaults:用於將各種類型數據保存到NSUserDefaults中

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

    [cpp] view
    plaincopy

    1. #import “ViewController.h”

    2. @interface ViewController ()

    3. @end

    4. @implementation ViewController

    5. – (void)viewDidLoad

    6. {

    7. [super viewDidLoad];

    8. [self saveNSUserDefaults]; //調用此方法將各種數據存儲到NSUserDefautls中,在下面定義

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

    10. }

    11. – (void)viewDidUnload

    12. {

    13. [txtNSString release];

    14. txtNSString = nil;

    15. [txtNSDate release];

    16. txtNSDate = nil;

    17. [txtNSArray release];

    18. txtNSArray = nil;

    19. [txtNSDictionary release];

    20. txtNSDictionary = nil;

    21. [txtInteger release];

    22. txtInteger = nil;

    23. [txtFloat release];

    24. txtFloat = nil;

    25. [txtDouble release];

    26. txtDouble = nil;

    27. [super viewDidUnload];

    28. // Release any retained subviews of the main view.

    29. }

    30. //保存數據到NSUserDefaults

    31. -(void)saveNSUserDefaults

    32. {

    33. NSString *myString = @”enuola”;

    34. int myInteger = 100;

    35. float myFloat = 50.0f;

    36. double myDouble = 20.0;

    37. NSDate *myDate = [NSDate date];

    38. NSArray *myArray = [NSArray arrayWithObjects:@”hello”, @”world”, nil];

    39. NSDictionary *myDictionary = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@”enuo”, @”20″, nil] forKeys:[NSArray arrayWithObjects:@”name”, @”age”, nil]];

    40. //將上述數據全部存儲到NSUserDefaults中

    41. NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

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

    43. [userDefaults setInteger:myInteger forKey:@”myInteger”];

    44. [userDefaults setFloat:myFloat forKey:@”myFloat”];

    45. [userDefaults setDouble:myDouble forKey:@”myDouble”];

    46. [userDefaults setObject:myString forKey:@”myString”];

    47. [userDefaults setObject:myDate forKey:@”myDate”];

    48. [userDefaults setObject:myArray forKey:@”myArray”];

    49. [userDefaults setObject:myDictionary forKey:@”myDictionary”];

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

    51. [userDefaults synchronize];

    52. }

    53. //從NSUserDefaults中讀取數據

    54. -(void)readNSUserDefaults

    55. {

    56. NSUserDefaults *userDefaultes = [NSUserDefaults standardUserDefaults];

    57. //讀取數據到各個label中

    58. //讀取整型int類型的數據

    59. NSInteger myInteger = [userDefaultes integerForKey:@”myInteger”];

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

    61. //讀取浮點型float類型的數據

    62. float myFloat = [userDefaultes floatForKey:@”myFloat”];

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

    64. //讀取double類型的數據

    65. double myDouble = [userDefaultes doubleForKey:@”myDouble”];

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

    67. //讀取NSString類型的數據

    68. NSString *myString = [userDefaultes stringForKey:@”myString”];

    69. txtNSString.text = myString;

    70. //讀取NSDate日期類型的數據

    71. NSDate *myDate = [userDefaultes valueForKey:@”myDate”];

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

    73. [df setDateFormat:@”yyyy-MM-dd HH:mm:ss”];

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

    75. //讀取數組NSArray類型的數據

    76. NSArray *myArray = [userDefaultes arrayForKey:@”myArray”];

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

    78. for(NSString *str in myArray)

    79. {

    80. NSLog(@”str= %@”,str);

    81. myArrayString = [NSString stringWithFormat:@”%@ %@”, myArrayString, str];

    82. [myArrayString stringByAppendingString:str];

    83. // [myArrayString stringByAppendingFormat:@”%@”,str];

    84. NSLog(@”myArrayString=%@”,myArrayString);

    85. }

    86. txtNSArray.text = myArrayString;

    87. //讀取字典類型NSDictionary類型的數據

    88. NSDictionary *myDictionary = [userDefaultes dictionaryForKey:@”myDictionary”];

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

    90. txtNSDictionary.text = myDicString;

    91. }

    92. @end

      好瞭,運行一下,可以看到xib文件中的各種數據已經綁定上瞭吧?

      vcHLo7/I57rOxNy5u8fls/2jv8bkyrXL/LTmtKLU2tOm08OzzNDyxNrWw7XE0ru49nBsaXN0zsS8/sDvo6zV4rj2v8nS1Lj5vt3Ct762v7S1vaGjscjI58u11eK49srHxOO1xLPM0PLJs7rQzrvWwzogL1VzZXJzL0xpYnJhcnkvQXBwbGljYXRpb24KIFN1cHBvcnQvaVBob25lU2ltdWxhdG9yLzQuMS9BcHBsaWNhdGkqKioqKi8yOTc4OEU0MC1BRjQ3LTQ1QTAtOEU5Mi0zQUMwRjUwMUI3RjQvLKOo1eK49srH06bTw7PM0PK21NOm1NptYWPJz7XEzrvWw6Op1eK49s/Cw+bT0C9MaWJyYXJ5L1ByZWZlcmVjZXOjrMDvw+bT0Lj2cGxpc3TOxLz+o6y05rSitcS+zcrHxOO1xHVzZXJEZWZhdWx0c8/r0qrJvrX0tcS7sKOs08NyZW1vdmVPYmplY3RGb3JLZXm78tXfyb619MmzutCjrNKyvs3Kx8TjtcTTptPDs8zQ8si7uvPW2NDCsLLXsKGjPC9wPgoKPHN0cm9uZz7I/SDXotLizsrM4jwvc3Ryb25nPgoKICAgIDGholVzZXJEZWZhdWx0c8rHuPm+3cqxvOS0wbaoyrG1xLDRu7q05tbQtcTK/b7d0LTI67G+tdi0xcXMo6y2+LfHvLTKsdC0yOuho86qwcu3wNa5yv2+3baqyqejrM7Sw8fU2rbU1tjSqrXEyv2+3bGjtObKscq508NzeW5jaG9ybml6Zbe9t6jHv9bG0LTI66GjtavKx9Ky0qrXotLio6yyu9PDxrW3sbXEyrnTw3N5bmNob3JuaXplo6zV4tH5sc++udOwz+zQ1MTcus3Qp8LKo6wKCiAgICAyoaJJT1OxvrXYtOa0os671sPLtcP3CjxwPgo8L3A+Cjx0YWJsZSBib3JkZXI9″0″ cellpadding=”5″ cellspacing=”0″>

      /Documents/

      您應該將所有的應用程序數據文件寫入到這個目錄下。這個目錄用於存儲用戶數據或其它應該定期備份的信息。有關如何取得這個目錄路徑的信息,請參見“獲取應用程序目錄的路徑”部分。

      iTunes會備份這個目錄的內容。

      /Library/Preferences

      這個目錄包含應用程序的偏好設置文件。您不應該直接創建偏好設置文件,而是應該使用NSUserDefaults類或CFPreferences API來取得和設置應用程序的偏好,詳情請參見“添加Settings程序包”部分。

      iTunes會備份這個目錄的內容。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *