亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

ios開發之數據的持久化存儲機制

2019-11-14 20:19:54
字體:
來源:轉載
供稿:網友

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代碼  

  1. - (void)encodeWithCoder:(NSCoder *)aCoder    
  2. {   //encoder    
  3.     [aCoder encodeObject:stringAforKey:@"1"];    
  4.     [aCoder encodeObject:stringBforKey:@"2"];    
  5. }    
  6. - (id)initWithCoder:(NSCoder *)aDecoder    
  7. {    
  8.     //decoder    
  9.     if (self = [superinit]) {    
  10. 10.         stringA = [[aDecoder decodeObjectForKey:@"1"] retain];    
  11. 11.         stringB = [[aDecoder decodeObjectForKey:@"2"] retain];    
  12. 12.     }    
  13. 13.     returnself;    

14. }    

  1. 15.     

16. #pragma NSCopying協議實現    

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

18. {    

  1. 19.     TestObj *copy = [[[selfclass] allocWithZone:zone] init];    
  2. 20.     copy.stringA = [[self.stringAcopyWithZone:zone] autorelease];    
  3. 21.     copy.stringB = [[self.stringBcopyWithZone:zone] autorelease];    
  4. 22.     return copy;    

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??吹糜悬c心煩~ 

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

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

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美性xxxx极品hd满灌| 日韩中文字幕在线视频| 久久久久久国产精品三级玉女聊斋| 国产精品27p| 欧美精品videosex性欧美| 精品二区三区线观看| 亚洲国产欧美一区二区三区同亚洲| 97久久精品国产| 在线日韩av观看| 亚洲精品电影在线观看| 欧美xxxx综合视频| 久久的精品视频| 在线播放日韩欧美| 91青草视频久久| 亚洲精品在线看| 欧美性xxxxhd| 97人洗澡人人免费公开视频碰碰碰| 精品国产一区二区三区久久狼5月| 俺去亚洲欧洲欧美日韩| 亚洲人成电影在线播放| 色狠狠久久aa北条麻妃| 亚洲自拍偷拍色图| 国产精品电影一区| 亚洲福利在线播放| 欧美激情精品久久久| 亚洲第一中文字幕在线观看| 91精品久久久久久久久久久| 成人欧美一区二区三区黑人| 国内精久久久久久久久久人| 亚洲电影免费观看高清完整版| 久久精品国产99国产精品澳门| 精品国内产的精品视频在线观看| 日本一区二三区好的精华液| 亚洲视频在线视频| 中日韩美女免费视频网址在线观看| 国模精品一区二区三区色天香| 精品在线观看国产| 欧美最猛性xxxxx免费| 欧美老女人性视频| 久久精品视频一| 亚洲第一页中文字幕| 青青在线视频一区二区三区| 欧美激情亚洲另类| 久久99精品久久久久久噜噜| 国产欧美va欧美va香蕉在线| 精品无人区乱码1区2区3区在线| 国内精品久久影院| 8x海外华人永久免费日韩内陆视频| 久久九九精品99国产精品| 日韩黄色在线免费观看| 最近2019中文免费高清视频观看www99| 91久久久亚洲精品| 亚洲国产精品电影在线观看| 欧美日韩精品中文字幕| 亚洲美女在线观看| 亚洲国产成人av在线| 欧美精品一区二区免费| 亚洲视频免费一区| 日韩一中文字幕| 欧美精品手机在线| 色播久久人人爽人人爽人人片视av| 欧美性少妇18aaaa视频| 亚洲国产一区二区三区在线观看| 欧美性xxxxxxx| 97色伦亚洲国产| 伊人久久久久久久久久久| 热草久综合在线| 国产精品视频一区二区三区四| 亚州av一区二区| 黄色一区二区在线观看| 国产z一区二区三区| 午夜精品在线观看| 成人午夜黄色影院| 亚洲天堂网站在线观看视频| 久久网福利资源网站| 欧美午夜激情小视频| 欧美国产中文字幕| 国产欧美va欧美va香蕉在线| 91精品视频在线| 毛片精品免费在线观看| 欧美激情中文字幕乱码免费| 欧美日韩激情网| 亚洲国产精品久久久| 在线观看视频99| 欧美成人精品在线| 亚洲精品日韩激情在线电影| 亚洲免费福利视频| 日韩黄色高清视频| 激情成人在线视频| 美日韩精品免费观看视频| 中文字幕精品在线| 中文字幕日韩在线播放| 欧美激情第99页| 欧美午夜丰满在线18影院| 奇米成人av国产一区二区三区| 国产精品色午夜在线观看| 精品无人国产偷自产在线| 久久久www成人免费精品| 在线播放亚洲激情| 欧美激情一区二区三级高清视频| 欧美午夜丰满在线18影院| 国外成人在线直播| 啪一啪鲁一鲁2019在线视频| 国产欧美在线观看| 美日韩精品免费视频| 国产精品r级在线| 国产日韩欧美在线播放| 丰满岳妇乱一区二区三区| 久久久久久久网站| 国产精品久久不能| 精品久久久久久久大神国产| 精品久久久91| 国产欧美精品一区二区三区-老狼| 国产精品福利无圣光在线一区| 亚洲人成电影在线播放| 亚洲人免费视频| 成人欧美一区二区三区在线| 国产丝袜精品第一页| 久青草国产97香蕉在线视频| 欧美高清视频在线观看| 国内精品久久久久影院优| 日韩中文视频免费在线观看| 欧美精品一区在线播放| 精品国产成人在线| 另类天堂视频在线观看| 精品久久久久久久久久国产| 亚洲人成自拍网站| 日本成人精品在线| 国产综合在线看| 亚洲精品久久久久中文字幕欢迎你| 欧美日韩综合视频| 国产精品成人观看视频国产奇米| 日韩av影院在线观看| 日韩欧美高清在线视频| 日韩在线不卡视频| 亚洲国产精品福利| 国产精品视频精品视频| 亚洲第一免费播放区| 欧美精品少妇videofree| 国产精品永久在线| 久久久噜噜噜久久久| 欧美激情三级免费| 国产精品自拍网| 国产精品久久久久久久久男| 国产精品视频久| 精品国产一区二区三区四区在线观看| 欧美色欧美亚洲高清在线视频| 一本色道久久88亚洲综合88| 国产日韩精品电影| 精品国产网站地址| 亚洲精品第一国产综合精品| 国语自产精品视频在线看| 久久视频在线免费观看| 国产精品稀缺呦系列在线| 黑人极品videos精品欧美裸| 日韩美女激情视频| 色综合天天狠天天透天天伊人| 亚洲理论电影网| 国产精品美女无圣光视频| 亚洲天堂开心观看| 欧美日韩国产中文字幕| 亚洲天堂一区二区三区| 中文欧美在线视频| 亚洲欧美制服中文字幕|