一、iOS應用數據存儲的常用方式
- 1、XML屬性列表(plist)歸檔
- 2、Preference(偏好設置)
- 3、NSKeyedArchiver歸檔(NSCoding)
- 所謂歸檔,是一個過程,即用某種格式來保存一個或者多個對象,以便以後還原這些對象
- 4、SQLite3
- 5、Core Data
二、數據存儲
1、 pist文件讀與寫
特點:只能存儲OC常用數據類型(NSString、NSDictionary、NSArray、NSData、NSNumber等類型)而不能直接存儲自定義模型對象
- 如果想存儲自定義模型對象 -> 只能將自定義模型對象轉換爲字典存儲;
1.1 使用須知:
前提條件:一個對象必須實現了writeToFile方法,因爲我們是通過調用對象的writeToFile方法將對象寫入到一個plist文件中的
// 將數組寫入plist文件:(系統提供的類實現的writeToFile方法) [array writeToFile:filePath atomically:YES];
plist只能識別字典,數組
- 1.2 讀寫數據 - > 實例代碼
NSString *docPath =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES)[0];
// 拼接要保存的地方的路徑
NSString *filePath = [docPathstringByAppendingPathComponent:@"str.plist"];
// 1、寫入數據
[array writeToFile:filePath atomically:YES];
// 2、 讀取數據
NSArray *array = [NSArray arrayWithContentsOfFile:filePath];
2、偏好設置:
每個應用都有個NSUserDefaults實例,通過它來存取偏好設置,比如,保存用戶名、字體大小、是否自動登錄
2.1 好處:
- 1.存儲數據不需要關心文件名稱
- 2.快速存儲鍵值對
2.2 底層實現:
- 它其實就是一個字典
2.3 用途: 賬戶或者密碼,開關狀態
2.4 注意:設置數據時,synchornize方法強制寫入
- UserDefaults設置數據時,不是立即寫入,而是根據時間戳定時地把緩存中的數據寫入本地磁盤。所以調用了set方法之後數據有可能還沒有寫入磁盤應用程序就終止了。出現以上問題,可以通過調用synchornize方法強制寫入
2.5 基本使用
NSUserDefaults *UserDefaults = [NSUserDefaultsstandardUserDefaults];
// 1、寫入
[UserDefaults setBool:NO forKey:@"isLogined"];
// 強制寫入
[defaults synchornize];
// 2、讀取
BOOL isVisble = [UserDefaults boolForKey:@"isLogined"];
3、獲取臨時文件夾路徑
// 3.1 獲取臨時文件夾路徑
NSString *tmp = NSTemporaryDirectory();
// 3.2 定義宏,快速訪問臨時文件夾中文件
#define FilePath [NSTemporaryDirectory() stringByAppendingPathComponent:@"person.data"]
4、歸檔 NSKeyedArchiver
特點:
- 1.可以存儲自定義模型對象
- NSKeyedArchiver歸檔相對較plist存儲而言,它可以直接存儲自定義模型對象,而plist文件需要將模型轉爲字典纔可以存儲自定義對象模型;
- 2.歸檔不能存儲大批量數據(相比較Sqlite而言),存儲數據到文件是將所有的數據一下子存儲到文件中,從文件中讀取數據也是一下子讀取所有的數據;
- 1.可以存儲自定義模型對象
缺點:
- 假如你的文件中有100個對象了,然後你想在利用歸檔添加一個對象,你需要先把所有的數據解檔出來,然後再加入你想添加的那個對象,同理,你想刪除一個文件中的一個對象也是,需要解檔出所有的對象,然後將其刪除。性能低這樣處理
4.1 基本使用:需要歸檔的模型類必須要遵守NSCoding協議,然後模型實現類中必須實現兩個方法:
- 1>encodeWithCoder -> 歸檔;
- 2> initWithCoder: - > 解檔
4.2 使用注意:
- 如果父類也遵守了NSCoding協議,請注意:
應該在encodeWithCoder:方法中加上一句 [super encodeWithCode:encode]; // 確保繼承的實例變量也能被編碼,即也能被歸檔 應該在initWithCoder:方法中加上一句 self = [super initWithCoder:decoder]; // 確保繼承的實例變量也能被解碼,即也能被恢復
- 如果父類也遵守了NSCoding協議,請注意:
基本使用
// 1. 自定義模型類Person
// 1.1 Person.h文件
#import <Foundation/Foundation.h>
// 只要一個自定義對象想要歸檔,必須要遵守NSCoding協議,並且要實現協議的方法
@interface Person : NSObject<NSCoding>
@property (nonatomic, assign) int age;
@property (nonatomic, strong) NSString *name;
@end
// 1.2 .m實現文件
#import "Person.h"
#define KName @"name"
#define KAge @"age"
@implementation Person
// 什麼時候調用:當一個對象要歸檔的時候就會調用這個方法歸檔
// 作用:告訴蘋果當前對象中哪些屬性需要歸檔
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:_name forKey:KName];
[aCoder encodeInt:_age forKey:KAge];
}
// 什麼時候調用:當一個對象要解檔的時候就會調用這個方法解檔
// 作用:告訴蘋果當前對象中哪些屬性需要解檔
// initWithCoder什麼時候調用:只要解析一個文件的時候就會調用
- (id)initWithCoder:(NSCoder *)aDecoder
{
#warning [super initWithCoder]
if (self = [super init]) {
// 解檔
// 注意一定要記得給成員屬性賦值
_name = [aDecoder decodeObjectForKey:KName];
_age = [aDecoder decodeIntForKey:KAge];
}
return self;
}
@end
// 2. 實例 -》基本使用:取 / 存 數據
// 歸檔
[NSKeyedArchiver archiveRootObject: self.persons toFile:KFilePath];// 將self.persons模型對象數組
// 解檔
_persons = [NSKeyedUnarchiver unarchiveObjectWithFile:KFilePath];
5、SQLite3
- 它是一款開源的嵌入式關係型數據庫,可移植性好、易使用、內存開銷小
- 特點:可以存儲大量數據
- 詳情,請參見 【SQLite3篇】
6、Core Data
- Core Data框架提供了對象-關係映射(ORM)的功能,
- 即能夠將OC對象轉化成數據,保存在SQLite3數據庫文件中,也能夠將保存在數據庫中的數據還原成OC對象。
- 在此數據操作期間,不需要編寫任何SQL語句。
- 使用此功能,要添加CoreData.framework和導入主頭文件
<CoreData/CoreData.h>
- 詳情,請參見【Core Data篇】,待續