ios開發之資料的持久化儲存機制

來源:互聯網
上載者:User

IOS中資料的持久化儲存這塊內容,類似於Android中檔案的幾種常見的儲存方式。 
對於資料的持久化儲存,ios中一般提供了4種不同的機制。 
1.屬性列表 
2.對象歸檔 
3.資料庫儲存(SQLite3) 
4.蘋果公司提供的持久性工具Core Data。 


其實儲存的形式無非就這麼幾種,而我們還必須要關心的是,這些檔案會被放置在那個檔案下,然後如何讀取。 
也就是說:IOS上資料存放區,我們要瞭解的兩點,資料存放區格式(也就是儲存機制),資料存放區位置。 
1》檔案如何儲存(如上面4點) 
2》檔案儲存體在哪裡。 
對於資料的操作,其實我們關心的是操作的速率。 
就好比在Adnroid中偏好儲存,資料庫儲存,io儲存一樣。 
我大致問了我們公司新來的ios哥們,他說他們培訓機構基本對資料操作這塊就講了屬性列表和資料庫,以及普通的檔案儲存體(比如音視頻圖這些多媒體資料)。 
我就只好先看看書了。 


一:應用檔案目錄 
首先我們來看瞭解下ios資料存放區位置,因為只有知道位置路徑我們才能去讀取資料,而資料的持久化機制不過是針對操作速率來考慮的, 
比如我們大致知道屬性列表(既索引值對形式)的儲存熟慮應該高於資料庫高於io檔案流儲存。 
我們在選擇用何種機制儲存資料,主要也是看資料的形式。 


一個ios應用安裝後大致會有如下檔案夾及其對應路徑: 
                       

在mac上看模擬器中應用路徑: 
/Users/nono/Library/Application Support/iPhone Simulator/5.1/Applications/2D135859-1E80-4754-B36D-34A53C521DE3 

你在finder中的home下可能找不到Library這個目錄,因為貌似是影藏起來了(我這機器上是,在終端可以看到)。 
最後那一竄的類似序號的東西就是ios自動給應用產生的一組應用唯一識別碼最為了應用的home目錄名。 
其下面就是所示了。 
書上對這些檔案夾介紹: 
Document:應用程式將其資料存放區在這個檔案夾下,基於NSUserDefaults的喜好設定的設定除外。 
簡單理解是,基本上我們要操作的一些資料都是儲存在這個檔案夾下面的 
TIPS:這邊提下一點,對於ios系統這麼分配檔案夾,是因為在裝置進行同步時,ITunes有選擇性的意識來備份檔案。 
比如我們可以猜到,tmp下的應該就不會備份了。 
對於Document檔案夾目錄路徑的擷取,API提供了這麼一種方法: 
[cpp] view plaincopy 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
   NSString *docPath = [paths objectAtIndex:0];  
Library:基於NSUserDefault喜好設定設定儲存在其下Preferences檔案夾中,簡單來說,這個檔案夾一般你很少操作到。 
書上對於這部分基本沒介紹。估計對於初級部分是跳過了。 
Tmp:應用臨時隱藏檔,當不需要時,應用負責刪除其下的檔案資料。 
該檔案也提供了目錄擷取方法: 

Java代碼  

14. }    

16. #pragma NSCopying協議實現    

17. - (id)copyWithZone:(NSZone *)zone    

18. {    

23. }    

24. @end    



然後是對對象歸檔的讀取和寫入 
[cpp] view plaincopy 
//讀取歸檔檔案  
   NSData *data = [[NSMutableDataalloc] initWithContentsOfFile:myFile];  
   NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiveralloc] initForReadingWithData:data];  
   TestObj * test = [unarchiver decodeObjectForKey:@"data"];  
   [unarchiver finishDecoding];  
   [data release];  
   [unarchiver release];  
     
   //寫入歸檔檔案  
   NSMutableData *data1 = [[NSMutableDataalloc] init];  
   NSKeyedArchiver *archiver = [[NSKeyedArchiveralloc] initForWritingWithMutableData:data1];  
   [archiver encodeObject:test forKey:@"data"];  
   [archiver finishEncoding];  
   [data writeToFile:myFile atomically:YES];  
   [data1 release];  
   [archiver release];  
   [test release];  

但是問了下新同事,據說這個用到也是蠻少,至少他目前。 
但是,我看了下,覺得這個和Android 中Parcelable 
太尼瑪像似了 


三.資料庫儲存 
和Android一樣,ios中也是用了SQLite3這種嵌入式資料庫。 
這個網上例子是很多了。我這邊就大致看下了資料庫的開啟, 
資料庫表建立,查詢,插入 
[cpp] view plaincopy 
//資料庫操作  
sqlite3 *database;  
// const NSString * dbname = @"mydb"  
int result;  
//開啟一個指定路徑的現有的資料庫,如果沒有則會建立一個db庫  
result =  sqlite3_open([myFile UTF8String], &database);  
if (result != SQLITE_OK) {  
     sqlite3_close(database);  
}  
   
//建立一個db表  
char *errorMsg;  
NSString *sql_create_table = @"CREATE TABLE IF NOT EXISTS NONOTABLE 省略~~~~~~~~~~~~~";  
int result1 ;  
//sqlite_exec用了針對sqlite3運行任何不要返回資料的命令,它用於執行更新,插入和刪除。簡單來說,這個方法執行的都是一些無需返回資料(雖然我們可能擷取一個狀態值。)。  
result1 = sqlite3_exec(database, [sql_create_table UTF8String], NULL, NULL, &errorMsg);  
   
//檢索查詢操作  
int result2 ;  
sqlite3_stmt *statment;  
NSString *sql_selected = @"查詢語句";  
result2 = sqlite3_prepare_v2(database, [sql_selected UTF8String], -1, &statment, nil);  
if(result2 == SQLITE_OK){  
     //單步操作  
     while (sqlite3_step(statment) == SQLITE_ROW) {  
         int row = sqlite3_column_int(statment, 0);  
         char * rpwData = sqlite3_column_text(statment, 1);    
     }  
     sqlite3_finalize(statment);  
}  
   
   
//綁定變數,既就是插入操作的一種變種,比如我麼那上面提到sqlite_exec可以執行插入操作,插入內容直接是寫在sql字竄裡,但是考慮到字竄涉及到無效的符號以及會一些嚴重的注入漏洞(比如以前聽過的引號符號)。  
NSString *sql_bind = @"insert into foo value(?,?)";  
result2 = sqlite3_prepare_v2(database, [sql_selected UTF8String], -1, &statment, nil);  
if(result2 == SQLITE_OK){  
     sqlite3_bind_int(statment, 1, 235);  
     sqlite3_bind_text(statment, 2, "test", -1, nil);  
           sqlite3_finalize(statment);  
}  
if (sqlite3_step(statment) != SQLITE_DONE)  
     NSLog(@"error");  
sqlite3_finalize(statment);  
  
  
sqlite3_close(database);  

關於更多的,大夥可以自行百度,因為資料庫的操作文法太怪異了,書上說是基本是基於c的,本人沒學過c。看得有點心煩~ 

4。Core Data儲存機制 
大致瀏覽下基本感覺就是將對象歸檔搞成了可視化和簡單化。 
這塊內容比較多。網上資料也挺豐富的。 
暫時不做介紹了。 

總結下:其實對於ios資料存放區,最常用和主要要掌握的就是屬性列表和資料庫,因為兩個是出鏡率比較高的。 
其他可能在資料存明顯體現出儲優勢時,我們會去考慮用另外兩種機制。 
基礎的來說,必須掌握屬性列表和sqlite的操作儲存。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.