iOS開發 資料儲存NSCoder

2021-09-06 21:03:23 字數 3118 閱讀 6757

軟體中永遠繞不開的乙個問題就是資料儲存的問題,pc的時候一般都是選擇在資料庫中儲存,ios如果是和後端配合的話,那麼不需要考慮資料儲存的這個問題,上次寫了一下plist的儲存,不過資料都是儲存一些簡單的鍵值對物件。本次需要將一些自己定義的型別儲存在plist比如說,這個時候可以利用nscoding協議,將資料地以類似檔案的形式儲存到plist檔案中,然後從plist的檔案中讀取資料,使用協議的時候這個時候就會用到了nscoder,如果對存檔和解壓沒有概念的話,可以簡單的理解為資料的序列化與反序列化。

nscoding是乙個protocol. 如果實現了nscoding,需要實現其中的兩個方法:

- (void)encodewithcoder:(nscoder *)acoder;

- (id)initwithcoder:(nscoder *)adecoder; // ns_designated_initializer

方法中的主要的引數就是nscoder,它是archivie位元組流的抽象類.可以將資料寫入乙個coder,也可以從coder中讀取我們寫入的資料. nscoder是乙個抽象類,不能直接使用它來建立物件. 但是可以通過其子類nskeyedunarchiver從位元組流中讀取資料,nskeyedarchiver將物件寫入到位元組流。本文以書籍為例:

新建乙個book類,book.h中的**:

#import #import @inte***ce book : nsobject@property (strong,nonatomic) uiimage *converpicture;

@property (strong,nonatomic) nsstring *bookname;

@property (strong,nonatomic) nsstring *author;

@property (strong,nonatomic) nsnumber *price;

@end

book.m中實現nscoding的兩個方法,注意中uiimage的寫法與其他有所不同:

@implementation book

- (void)encodewithcoder:(nscoder *)acoder

- (id)initwithcoder:(nscoder *)adecoder

@end

正常的情況的不需要新建頁面的,不過需要演示一下uiimage的效果,main.storyboard中的布局:

稍微解釋一下,前兩個是存的單檔案,後兩個存的是多檔案,uiimage展示儲存的:

viewcontroller定義字段:

@property (strong,nonatomic) nsstring *storagepath;

@property (strong,nonatomic) nsstring *storagelistpath;

@property (strong,nonatomic) nsmutablearray *booklist;

設定路徑,如果不是很清晰,可參考本文之前的部落格:

nsarray *codepath= nssearchpathfordirectoriesindomains(nsdocumentdirectory, nsuserdomainmask, yes);

nslog(@"%@",nshomedirectory());

單個存檔:

book.bookname=@"百年孤獨";

book.author=@"加西亞.馬爾克斯";

book.price=[[nsnumber alloc] initwithinteger:45];

if ([nskeyedarchiver archiverootobject:book tofile:_storagepath])

單個解壓:

book *decodebook=[nskeyedunarchiver unarchiveobjectwithfile:_storagepath];

self.myimageview.image=decodebook.converpicture;

nslog(@"%@",decodebook.converpicture);

nslog(@"%@",decodebook.bookname);

nslog(@"解檔成功");

多個存檔:

self.booklist=[nsmutablearray array];

for (nsinteger i=1; i<3; i++)

if ([nskeyedarchiver archiverootobject:self.booklist tofile:_storagelistpath])

多個解檔:

self.booklist=[nskeyedunarchiver unarchiveobjectwithfile:_storagelistpath];

book *nextbook=self.booklist[1];

self.myimageview.image=nextbook.converpicture;

nslog(@"解檔成功");

通過**基本上發現其實存檔和解壓是非常簡單的乙個事情,不過事實這種方式缺點還是很明顯的,以這種方式儲存資料

只能一次性歸檔儲存以及一次性解壓。資料較少的時候如果使用感覺比較方便,資料量過多的時候如果想修改其中的某一條,解壓整個資料然後歸檔整個資料還是比較耗時的。最終演示效果如下:

資料儲存 IOS開發

常見的資料儲存方式 plist格式檔案儲存 propertlist屬性列表 nsuserdefaults儲存 解歸檔儲存 nskeyedarchiver歸檔 nskeyedunarchiver解檔 資料庫 sqlite3,基於sqlite3的fmdb,coredata plist檔案 nsuserd...

iOS開發之資料儲存

xml屬性列表 plist 歸檔 preference 偏好設定 本質還是通過 plist 來儲存資料,但是使用更簡單 無需關注檔案 資料夾路徑和名稱 nskeyedarchiver歸檔 nscoding 把任何物件,直接儲存為檔案的方式。sqlite3 當非常大量的資料儲存時使用 core dat...

iOS開發永久資料儲存方式

ios開發的永久資料儲存方式總共有6種。分別是 1.nsuserdefaults 2.歸檔和解檔 序列化 3.plist檔案儲存 4.資料庫 sqlite 5.coredata 6.keychain 一 nsuserdefaults 儲存的基本資料型別 nsstring nsarray nsdict...