開發中經常涉及到資料持久化,避免了重複的請求伺服器,減少了使用者流量的消耗
1.NSUserDefault;
2.NSKeyedArchiver \ NSKeyedUnarchiver 歸檔
3. 嵌入式資料庫 SQLite3
4.寫入磁盤 .沙盒存儲
1.NSUserDefault
官方API
NSUserDefaults類提供了便利的方法來通路常見類型如漂浮,雙打,整數,布爾和url。一個預設的對象必須是一個屬性清單,也就是的一個執行個體(或集合的組合的執行個體):NSData,NSString,NSNumber,處理NSDate,NSArray或NSDictionary。如果你想存儲其他類型的對象,通常你應該存檔NSData它來建立一個執行個體。更多細節,請參閱偏好和設定程式設計指南。
自動為每個使用者建立一個預設的資料庫。NSUserDefaults類目前不支援中偏好。要做到這一點,您必須使用CFPreferences API(參見偏好工具參考)。然而,NSUserDefaults正确讀取中偏好,是以您可以安全地混合CFPreferences代碼與NSUserDefaults代碼
如果您的應用程式支援管理環境中,您可以使用一個NSUserDefaults對象來确定哪些偏好是由管理者使用者的利益。管理環境對應計算機實驗室或教室管理者或教師可能需要配置系統在一個特定的方式。在這些情況下,管理者可以建立一組預設首選項,迫使那些偏好的使用者。如果一個偏好管理通過這種方式,應用程式應該防止使用者編輯,偏好通過禁用任何适當的控制。
作為輕量級存儲方式,上代碼
- (void)viewDidLoad {
[super viewDidLoad];
[self saveData];
[self readData];
}
- (void)saveData
{
int myInteger = 100;
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setInteger:myInteger forKey:@"myKey"];
//同步存儲到磁盤中,但是不是必須的
[userDefaults synchronize];
}
- (void)readData
{
NSUserDefaults *userDefaultes = [NSUserDefaults standardUserDefaults];
//讀取整型int類型的資料
NSInteger myInteger = [userDefaultes integerForKey:@"myKey"];
NSLog(@"%ld",myInteger);
}
列印結果:
儲存位置:
位于沙盒目錄的 Library - Preferences --- plist 檔案中
就在plist裡面
2.NSKeyedArchiver \ NSKeyedUnarchiver 歸檔
- (void)NSKeyedArchiverData
{
// 測試資料
NSString *str1 = @"abc";
NSString *str2 = @"123";
NSArray *Array = [NSArray arrayWithObjects:str1, str2, nil];
//Documents目錄
NSString *Path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *filePath = [Path stringByAppendingPathComponent:@"test"];
/**
* 歸檔
*/
[NSKeyedArchiver archiveRootObject:Array toFile:filePath];
/**
* 解歸檔
*/
NSArray *dataArray = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
for (NSString *str in dataArray) {
NSLog(@"textStr ---- %@",str);
}
}
輸出結果
3. 嵌入式資料庫 SQLite3
請參考: 參考部落格位址
4.寫入磁盤 .沙盒存儲
- (void)NSFileManagerSave
{ //建立一個檔案
NSFileManager *manager = [NSFileManager defaultManager];
NSString *filePath = [self filePath];
[manager createFileAtPath:filePath contents:nil attributes:nil];
//測試資料
UIImage *image = [UIImage imageNamed:@"1.jpg"];
NSData *imageData = UIImageJPEGRepresentation(image, 1);
//寫入檔案
[imageData writeToFile:filePath atomically:YES];
}
- (void)readNSFileManager
{ //從檔案中讀取資料
NSData *data = [NSData dataWithContentsOfFile:[self filePath]];
UIImage *image = [UIImage imageWithData:data];
}
測試結果:
其實也可以,在沙盒拼接路徑,不用NSFileManager,效果相同
- (NSString *)getPath:(NSString *)fileName
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:fileName];
return filePath;
}
參考部落格:
http://blog.csdn.net/chyroger/article/details/5785297
http://blog.csdn.net/ios_che/article/details/7286924