ios持久化存儲
㈠ OC -- 應用數據儲存方式
之前對數據之久化一直都是一知半解,只知道有幾種方法,但不清楚這幾種方法的區別.經過網上的查詢和學習.寫一下自己的心得體會.
數據持久化說白了就是將數據保存到本地的磁碟中.使得在應用程序重啟後可以繼續訪問之前保存的數據.在ios中運用了很多的存儲方式,一般我們用的方式分為以下5中:
沙盒是蘋果的發明的內存管理機制,ios 程序默認情況下只能訪問程序自身的目錄,且這個目錄被稱為"沙盒"
應用程序包: 包含了所有的資源文件和可執行的文件.
Documents :保存應用運行時生成的需要數據持久化的數據,iTunes同步設備時會備份目錄.例如游戲存檔
tmp: 保存應用運行時所需的臨時數據,使用完後就會將相應的文件從該目錄刪除,應用沒有運行時,系統可能也會清除該文件下的數據.iTunes同步設備時,不會備份該目錄.
Library / Caches : 保存應用運行時生成的需要持久化的數據,iTunes同步設備時不會備份該目錄.-----一般存儲體積大.不需要備份的非重要數據.
Library / Preference :保存應用的所有偏好設置,iOS的settings(設置)應用會在改目錄中查找應用的設置信息.iTunes同步設備時會備份該目錄.
雖然沙盒中有這么多文件夾,但是每個文件夾功能都是不相同的在上面我們也描述了,每次文件夾的功能.所以以後在存儲數據的時候要注意存儲的文件.一定要選擇合適的文件夾.
獲取相應文件夾位置的方法.
獲取沙盒根目錄
應用程序包:
Documents:(有兩種獲取方式)
TMP
Library/Caches:
Library/Preference
Plist文件
plist文件是將某些特定的類,通過XML的文件方式保存在目錄中,並且plist 文件是存儲在Documents文件夾下面的.
可以被序列化的類型只有如下幾種:
1獲取文件路徑
2.存儲
3.讀取
4.注意
只有以上列出的類型才能使用plist文件存儲。
存儲時使用writeToFile: atomically:方法。 其中atomically表示是否需要先寫入一個輔助文件,再把輔助文件拷貝到目標文件地址。這是更安全的寫入文件方法,一般都寫YES。
讀取時使用arrayWithContentsOfFile:方法。
㈡ ios中的持久化操作方式有哪些
iOS中的數據持久化方式,基本上有以下四種:屬性列表、對象歸檔、sqlite3和Core Data
1.屬性列表
涉及到的主要類:NSUserDefaults,一般 [NSUserDefaults standardUserDefaults]就夠用了
@interface User : NSObject <NSCoding>
@property (nonatomic, assign) NSInteger userID;
@property (nonatomic, ) NSString *name;
@end
使用方法
1).分開存取
// 存
[[NSUserDefaults standardUserDefaults] setInteger:userID forKey:@」userID」];
[[NSUserDefaults standardUserDefaults] setObject:name forKey:@」name」];
// 取
NSInteger uId = [[[NSUserDefaults standardUserDefaults] integerValueForKey:@」userID」];
NSString* name = [[NSUserDefaults standardUserDefaults] stringForKey:@」name」];
2).按對象存取
// 存
[[NSUserDefaults standardUserDefaults] setObject:self forKey:@」user」];
// 取
User* u = [[NSUserDefaults standardUserDefaults] objectForKey」@」user」];
2.對象歸檔
要使用對象歸檔,對象必須實現NSCoding協議.大部分Object C對象都符合NSCoding協議,也可以在自定義對象中實現NSCoding協議,要實現NSCoding協議,實現兩個方法:
- (void) encodeWithCoder:(NSCoder *)encoder 與 -(void)initWithCoder:(NSCoder *)encoder
同時,建議對象也同時實現NSCopying協議,該協議允許復制對象,要實現NSCopying協議須實現 -(id)WithZone:(NSZone *)zone 方法 。
@interface User : NSObject <NSCoding>
@property (nonatomic, assign) NSInteger userID;
@property (nonatomic, ) NSString *name;
@end
@implementation User
// 以下兩個方法一定要實現,不然在調用的時候會crash
- (void)encodeWithCoder:(NSCoder *)aCoder;
{
// 這里放置需要持久化的屬性
[aCoder encodeObject:[NSNumber numberWithInteger:self.userID] forKey:@」userID」];
[aCoder encodeObject:self.name forKey:@"name"];
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
if (self = [self init])
{
// 這里務必和encodeWithCoder方法裡面的內容一致,不然會讀不到數據
self.userID = [[aDecoder decodeObjectForKey:@"userID"] integerValue];
self.name = [aDecoder decodeObjectForKey:@"name"];
}
return self;
}
// 使用方法
+ (BOOL)save {
NSError *error = nil;
// 確定存儲路徑,一般是Document目錄下的文件
NSString* fileName = [self getFileName];
NSString* filePath = [self getFilePath];
if (![[NSFileManager defaultManager] createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:&error]) {
NSLog(@」創建用戶文件目錄失敗」);
return NO;
}
return [NSKeyedArchiver archiveRootObject:self toFile:[fileName:userId]];
}
@end
3.SQLite3
SQLite是一個開源的嵌入式關系資料庫,它在2000年由D. Richard Hipp發布,它的減少應用程序管理數據的開銷,SQLite可移植性好,很容易使用,很小,高效而且可靠。
SQLite嵌入到使用它的應用程序中,它們共用相同的進程空間,而不是單獨的一個進程。從外部看,它並不像一個RDBMS,但在進程內部,它卻是完整的,自包含的資料庫引擎。 嵌入式資料庫的一大好處就是在你的程序內部不需要網路配置,也不需要管理。因為客戶端和伺服器在同一進程空間運行。SQLite 的資料庫許可權只依賴於文件系統,沒有用戶帳戶的概念。SQLite 有資料庫級鎖定,沒有網路伺服器。它需要的內存,其它開銷很小,適合用於嵌入式設備。你需要做的僅僅是把它正確的編譯到你的程序。
關於SQLite的開發資料較多,這里不再細說。只是建議不直接操作SQLite庫,而是採用一些開源的第三方庫來進行操作。
對SQLite都做了不錯的封裝。
4.Core Data
Core Data本質上是使用SQLite保存數據,但是它不需要編寫任何SQL語句。
要使用Core Data,需要在Xcode中的數據模型編輯器中設計好各個實體以及定義好他們的屬性和關系。之後,通過操作這些對象,結合Core Data完成數據的持久化:
NSManagedObjectContext *context = [appDelegate managedObjectContext];
NSError *error;
NSString *fieldName = [NSString stringWithFormat:@"test%d", i];
UITextField *theField = [self valueForKey:fieldName];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
//創 建描述語句,需求Line對象。類似於在資料庫中限定為Line表。
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Line" inManagedObjectContext:context];
[request setEntity:entityDescription];
//創建限制性語句,類似於SQL語句中的 where lineNum = i
NSPredicate *pred = [NSPredicate predicateWithFormat:@"(lineNum = %d)", i];
[request setPredicate:pred];
NSManagedObject *theLine = nil;
NSArray *objects = [context executeFetchRequest:request error:&error];
if (objects == nil){
NSLog(@」There was an error!」);
// Do whatever error handling is appropriate
}
if ([objects count] > 0){ //如果符合條件的object存在,則取出
theLine = [objects objectAtIndex:0];
}
else { //如果不存在,則插入一個新的.
theLine = [NSEntityDescription :@"Line"
inManagedObjectContext:context];
[theLine setValue:[NSNumber numberWithInt:i] forKey:@」lineNum」]; //設置這個object的屬性,coredata會自動將其寫入sqlite
[theLine setValue:theField.text forKey:@"lineText"];
[request release];
}
}
下面是其取數據的過程:
Core_Data_PersistenceAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = [appDelegate managedObjectContext];
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Line"
inManagedObjectContext:context];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entityDescription];
NSError *error;
NSArray *objects = [context executeFetchRequest:request error:&error];
if (objects == nil)
{
NSLog(@」There was an error!」);
// Do whatever error handling is appropriate
}
//每一個對象在CoreData中都表示為一個NSManagedObject對象(類似於資料庫表中的每一行),他的屬性通過鍵/值 方式獲取
for (NSManagedObject *oneObject in objects)
{
NSNumber *lineNum = [oneObject valueForKey:@"lineNum"];
NSString *lineText = [oneObject valueForKey:@"lineText"];
}
[request release];
轉載
㈢ ios開發中數據持久化有哪幾種,分別什麼時間使用
1、plist文件(屬性列表),通常用於儲存用戶設置,也可以用於存儲捆綁的信息;
2、preference(偏好設置),常用於保存少量數據;
3、NSKeyedArchiver(歸檔),將內存中的對象實例保存成binary到磁碟並且可以逆向這個過程用來保存用戶操作狀態等;
4、SQLite 3,使用資料庫進行存儲;
5、CoreData,它提供了對象-關系映射(ORM)的功能,即能夠將OC對象轉化成數據,保存在SQLite資料庫文件中,也能夠將保存在資料庫中的數據還原成OC對象。
㈣ IOS 存儲方式(PList、NSUserDefaults、歸檔、CoreData、資料庫、文件)
iOS開發,plist文件讀寫那些事 - (jianshu.com)
NSUserDefaults存儲輕量級 的本地數據 ,比如要保存一個登陸界面的數據,用戶名、密碼之類的。
支持的數據類型有 NSString、 NSNumber、NSInteger、NSFloat、BOOL、NSArray、NSDictionary、NSDate、 等系統定義的數據類型。
用NSUserDefaults存儲的數據下次程序運行的時候依然存在 .它的數據存儲在應用程序內置的一個plist文件里, 在/Library/Prefereces沙盒路徑下.
NSUserDefaults是定時把緩存中的數據寫入磁碟的,而不是即時寫入,為了防止在寫完NSUserDefaults後程序退出導致的數據丟失,可以在寫入數據後使用synchronize強制立即將數據寫入磁碟:
使用NSKeyedArchiver 對數據進行 歸檔 反歸檔(將自定義類型轉換為NSData類型:)
NSuserDefaults 的坑
iOS 最終,我還是決定放棄使用NSUserDefaults了 - (jianshu.io)
歸檔: ,就是將數據寫到一個文件裡面去。一般我們的應用的變數常量之類的數據都是在內存裡面的,只要APP關閉,這些數據都會丟失。但是把數據存儲到文件裡面去,就能將數據保存到本地磁碟裡面(目前iOS基本就是在沙盒裡面操作了),不管是APP關閉還是重啟設備,下次啟動APP的時候都能夠讀出來。
解檔: (別人也叫反歸檔),就是將數據從文件裡面讀取出來。在程序裡面使用。
【iOS】數據持久化:使用NSKeyedArchiver進行數據歸檔 - (jianshu.com)
iOS 開發Core Data使用方法 – 技術狗 (jishudog.com)
IOS 開發文件操作——NSFileManager - 星語海藍 - 博客園 (cnblogs.com)
(15條消息) iOS文件操作_你有故事,我囿酒-CSDN博客
參考:
iOS開發 - 關於 NSUserDefaults 的使用 - (jianshu.com)
㈤ iOS數據存儲(一)介紹
iOS本地化存儲的數據保存在沙盒中。
(1) Documents :iTunes會備份該目錄。一般用來存儲需要持久化的數據。
(2) Library/Caches :緩存,iTunes不會備份該目錄。內存不足時會被清除,應用沒有運行時,可能會被清除。一般存儲體積大、不需要備份的非重要數據。
(3) Library/Preference :iTunes同會備份該目錄,可以用來存儲一些偏好設置。
(4) tmp : iTunes不會備份這個目錄,用來保存臨時數據,應用退出時會清除該目錄下的數據。
獲取沙盒文件:
其中:
可以把字典或數組直接寫入到文件中。另外, NSString 、 NSData 、 NSNumber 等類型,也可以使用 writeToFile:atomically: 方法直接將對象寫入文件中,只是 Type 為空。
NSUserDefaults是輕量級存儲,一般使用它來進行一些設置的記錄,比如用戶ID,開關是否打開等設置,通過鍵值對的方式記錄設置,所以這個有時候也被稱為偏好設置。
NSUserDefaults可以存儲的數據類型包括: NSData 、 NSString 、 NSNumber 、 NSDate 、 NSArray 、 NSDictionary 。如果要存儲其他類型,則需要轉換為前面的類型,才能用NSUserDefaults存儲。
也可以寫成宏定義
㈥ iOS中常用的幾種持久化存儲
1、偏好設置(NSUserDefaults)
2、plist文件存儲
3、歸檔
4、SQLite
5、Core Data
我們首先需要了解下沙盒(Sandbox)
Application :存放程序源文件,上架前經過數字簽名,上架後不可修改
Documents : 保存應⽤運行時生成的需要持久化的數據,iTunes同步設備時會備份該目錄。例如,游戲應用可將游戲存檔保存在該目錄
tmp : 保存應⽤運行時所需的臨時數據,使⽤完畢後再將相應的文件從該目錄刪除。應用 沒有運行時,系統也可能會清除該目錄下的文件。iTunes同步設備時不會備份該目錄。
Library/Caches : 保存應用運行時⽣成的需要持久化的數據,iTunes同步設備時不會備份 該目錄。⼀一般存儲體積大、不需要備份的非重要數據,比如網路數據緩存存儲到Caches下
Library/Preference : 保存應用的所有偏好設置,如iOS的Settings(設置) 應⽤會在該目錄中查找應⽤的設置信息。iTunes同步設備時會備份該目錄
NSUserDefaults是個單例類,用於存儲少量數據。NSUserDefaults實際上對plist文件操作的封裝,更方便我們直接操作,一般用於存儲系統級別的偏好設置。比如我們經常將登錄後的用戶的一些設置通過NSUserDefaults存儲到plist文件中。
NSUserDefaults使用起來非常簡單,例如將用戶的賬號和密碼存儲起來:
㈦ ios數據持久化 - preference(偏好設置)
1.plist文件(屬性列表)
2.preference(偏好設置)
3.NSKeyedArchiver(歸檔)
4.SQLite 3
5.CoreData
偏好設置是專門用來保存應用程序的配置信息的,一般不要在偏好設置中保存其他數據。
如果沒有調用synchronize方法,系統會根據I/O情況不定時刻地保存到文件中。所以如果需要立即寫入文件的就必須調用synchronize方法。
偏好設置會將所有數據保存到同一個文件中。即preference目錄下的一個以此應用包名來命名的plist文件。
NSUserDefaults適合存儲輕量級的本地數據,如登陸界面的數據,用戶名、密碼等用戶偏好設置類的數據。下次啟動應用的時候就可以直接從NSUserDefaults裡面讀取上次運行的數據。
如果使用自己建立的plist文件什麼的,需要自己顯式創建文件,讀取文件,很麻煩,而如果用NSUserDefaults則不用管這些,就像讀字典一樣,直接讀取數據就可以了,同時NSUserDefaults有緩存機制,可以避免頻繁讀寫文件。
NSUserDefaults支持的數據格式有:NSNumber(BOOL、Integer、Float、Double),NSString,NSDate,NSArray,NSDictionary,NSData類型。
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
//添加preference
[defaults setObject:@"value1" forKey:@"key1"];
[defaults setObject:@1111 forKey:@"key2"];
[defaults synchronize];
//刪除preference
[defaults removeObjectForKey:@"key1"];
[defaults synchronize];
//修改preference
[defaults setObject:@"value2" forKey:@"key1"];
[defaults synchronize];
//刪除所有preference
NSString *appDomainStr = [[NSBundle mainBundle] bundleIdentifier];
[defaults removePersistentDomainForName:appDomainStr];
NSString *key1Value = [defaults objectForKey:@"key1"];
NSNumber *key2Value = [defaults objectForKey:@"key2"];
NSLog(@"偏好設置=%@=%@",key1Value,key2Value);
