一铣鹏、iOS應(yīng)用數(shù)據(jù)存儲的常用方式
- 1、XML屬性列表(plist)歸檔
- 2卓箫、Preference(偏好設(shè)置)
- 3碘勉、NSKeyedArchiver歸檔(NSCoding) // 所謂歸檔,是一個過程奇瘦,即用某種格式來保存一個或者多個對象棘催,以便以后還原這些對象
- 4、SQLite3
- 5耳标、Core Data
二醇坝、數(shù)據(jù)存儲
1、 pist文件讀與寫
-
特點(diǎn):只能存儲OC常用數(shù)據(jù)類型(NSString、NSDictionary呼猪、NSArray画畅、NSData、NSNumber等類型)而不能直接存儲自定義模型對象
- 如果想存儲自定義模型對象 -> 只能將自定義模型對象轉(zhuǎn)換為字典存儲宋距;
-
1.1 使用須知:
- 前提條件:一個對象必須實(shí)現(xiàn)了writeToFile方法轴踱,因?yàn)槲覀兪峭ㄟ^調(diào)用對象的writeToFile方法將對象寫入到一個plist文件中的
// 將數(shù)組寫入plist文件:(系統(tǒng)提供的類實(shí)現(xiàn)的writeToFile方法) [array writeToFile:filePath atomically:YES];
- plist只能識別字典,數(shù)組
1.2 讀寫數(shù)據(jù) - > 實(shí)例代碼
NSString *docPath =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES)[0];
// 拼接要保存的地方的路徑
NSString *filePath = [docPathstringByAppendingPathComponent:@"str.plist"];
// 1、寫入數(shù)據(jù)
[array writeToFile:filePath atomically:YES];
// 2谚赎、 讀取數(shù)據(jù)
NSArray *array = [NSArray arrayWithContentsOfFile:filePath];
**?2淫僻、偏好設(shè)置: **
每個應(yīng)用都有個NSUserDefaults實(shí)例,通過它來存取偏好設(shè)置壶唤,比如雳灵,保存用戶名、字體大小闸盔、是否自動登錄
-
2.1 好處:
- 1.存儲數(shù)據(jù)不需要關(guān)心文件名稱
- 2.快速存儲鍵值對
-
2.2 底層實(shí)現(xiàn):
- 它其實(shí)就是一個字典
2.3 用途: 賬戶或者密碼,開關(guān)狀態(tài)
-
2.4 注意:
設(shè)置數(shù)據(jù)時(shí)悯辙,synchornize方法強(qiáng)制寫入
- UserDefaults設(shè)置數(shù)據(jù)時(shí),不是立即寫入迎吵,而是根據(jù)時(shí)間戳定時(shí)地把緩存中的數(shù)據(jù)寫入本地磁盤躲撰。所以調(diào)用了set方法之后數(shù)據(jù)有可能還沒有寫入磁盤應(yīng)用程序就終止了。出現(xiàn)以上問題钓觉,可以通過調(diào)用synchornize方法強(qiáng)制寫入
2.5 基本使用
NSUserDefaults *UserDefaults = [NSUserDefaultsstandardUserDefaults];
// 1茴肥、寫入
[UserDefaults setBool:NO forKey:@"isLogined"];
// 強(qiáng)制寫入
[defaults synchornize];
// 2、讀取
BOOL isVisble = [UserDefaults boolForKey:@"isLogined"];
3荡灾、獲取臨時(shí)文件夾路徑
// 3.1 獲取臨時(shí)文件夾路徑
NSString *tmp = NSTemporaryDirectory();
// 3.2 定義宏瓤狐,快速訪問臨時(shí)文件夾中文件
#define FilePath [NSTemporaryDirectory() stringByAppendingPathComponent:@"person.data"]
4、歸檔 NSKeyedArchiver
-
特點(diǎn):
-
- 可以存儲自定義模型對象
- NSKeyedArchiver歸檔相對較plist存儲而言批幌,它可以直接存儲自定義模型對象础锐,而plist文件需要將模型轉(zhuǎn)為字典才可以存儲自定義對象模型;
- 2.歸檔不能存儲大批量數(shù)據(jù)(相比較Sqlite而言)荧缘,存儲數(shù)據(jù)到文件是將所有的數(shù)據(jù)一下子存儲到文件中皆警,從文件中讀取數(shù)據(jù)也是一下子讀取所有的數(shù)據(jù);
-
-
缺點(diǎn):
- 假如你的文件中有100個對象了截粗,然后你想在利用歸檔添加一個對象信姓,你需要先把所有的數(shù)據(jù)解檔出來,然后再加入你想添加的那個對象绸罗,同理意推,你想刪除一個文件中的一個對象也是,需要解檔出所有的對象珊蟀,然后將其刪除菊值。性能低這樣處理
4.1 基本使用:需要?dú)w檔的模型類必須要
遵守NSCoding協(xié)議
,然后模型實(shí)現(xiàn)類中必須實(shí)現(xiàn)兩個方法
:1>encodeWithCoder ->歸檔
;2> initWithCoder: - >解檔
-
4.2 使用注意:
- 如果父類也遵守了NSCoding協(xié)議腻窒,請注意:
應(yīng)該在encodeWithCoder:方法中加上一句
[super encodeWithCode:encode]; // 確保繼承的實(shí)例變量也能被編碼昵宇,即也能被歸檔
應(yīng)該在initWithCoder:方法中加上一句
self = [super initWithCoder:decoder]; // 確保繼承的實(shí)例變量也能被解碼,即也能被恢復(fù)
+ 基本使用
```objc
// 1. 自定義模型類Person
// 1.1 Person.h文件
#import <Foundation/Foundation.h>
// 只要一個自定義對象想要?dú)w檔,必須要遵守NSCoding協(xié)議,并且要實(shí)現(xiàn)協(xié)議的方法
@interface Person : NSObject<NSCoding>
@property (nonatomic, assign) int age;
@property (nonatomic, strong) NSString *name;
@end
// 1.2 .m實(shí)現(xiàn)文件
#import "Person.h"
#define KName @"name"
#define KAge @"age"
@implementation Person
// 什么時(shí)候調(diào)用:當(dāng)一個對象要?dú)w檔的時(shí)候就會調(diào)用這個方法歸檔
// 作用:告訴蘋果當(dāng)前對象中哪些屬性需要?dú)w檔
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:_name forKey:KName];
[aCoder encodeInt:_age forKey:KAge];
}
// 什么時(shí)候調(diào)用:當(dāng)一個對象要解檔的時(shí)候就會調(diào)用這個方法解檔
// 作用:告訴蘋果當(dāng)前對象中哪些屬性需要解檔
// initWithCoder什么時(shí)候調(diào)用:只要解析一個文件的時(shí)候就會調(diào)用
- (id)initWithCoder:(NSCoder *)aDecoder
{
#warning [super initWithCoder]
if (self = [super init]) {
// 解檔
// 注意一定要記得給成員屬性賦值
_name = [aDecoder decodeObjectForKey:KName];
_age = [aDecoder decodeIntForKey:KAge];
}
return self;
}
@end
// 2. 實(shí)例 -》基本使用:取 / 存 數(shù)據(jù)
// 歸檔
[NSKeyedArchiver archiveRootObject: self.persons toFile:KFilePath];// 將self.persons模型對象數(shù)組
// 解檔
_persons = [NSKeyedUnarchiver unarchiveObjectWithFile:KFilePath];
5儿子、SQLite3
- 它是一款開源的嵌入式關(guān)系型數(shù)據(jù)庫瓦哎,可移植性好、易使用典徊、內(nèi)存開銷小
- 特點(diǎn):可以存儲大量數(shù)據(jù)
- 詳情杭煎,請參見 【SQLite3篇】
6、Core Data
- Core Data框架提供了
對象-關(guān)系映射(ORM)的功能
卒落,- 即能夠?qū)C對象轉(zhuǎn)化成數(shù)據(jù)羡铲,保存在SQLite3數(shù)據(jù)庫文件中,也能夠?qū)⒈4嬖跀?shù)據(jù)庫中的數(shù)據(jù)還原成OC對象儡毕。
- 在此數(shù)據(jù)操作期間也切,
不需要編寫任何SQL語句
。 - 使用此功能腰湾,要添加CoreData.framework和導(dǎo)入主頭文件<CoreData/CoreData.h>
- 詳情雷恃,請參見【Core Data篇】