一它碎、判斷是否適合使用Core Data
要使用持久化數(shù)據(jù),我們有多種選擇:
1.NSUserDefaults: ? 這種方式通常用于保存應(yīng)用首選項.NSUserDefaults很像使用鍵值存儲的NSDictionary疟丙,可存儲用NSNumber怒坯、NSString府蔗、NSDate就斤、NSData培漏、NSDictionary或NSArray表示的值,還可以存儲任何遵守了NSCoding協(xié)議的對象舰讹。如果使用鍵值對、字典或數(shù)組可滿足應(yīng)用的持久化需求闪朱,就可使用NSUserDefaults月匣。
2.keychain:對于應(yīng)用里存在對安全性要求的賬號密碼等數(shù)據(jù)可以存放在這里,由于keychain是獨立于APP的沙盒存放的奋姿,屬于系統(tǒng)級的存放锄开,所以不會隨著應(yīng)用的刪除而刪除。(這里有一篇簡單使用的例子http://www.reibang.com/p/9188235eedab)
3.屬性列表(plist):NSDictionary和NSArray都支持讀寫用戶定義的屬性列表文件称诗,這種文件采用XML格式萍悴,可存儲NSNumber、NSString、NSDate癣诱、NSData计维、NSDictionary和NSArray。如果使用字典或數(shù)組可滿足應(yīng)用的持久化需求撕予,就可使用屬性列表文件鲫惶。
4.編碼器(Coder)和鍵式歸檔(Key Archive):NSCoder和NSKeyedArchiver支持將任何對象存儲到二進制文件中。要使用這種持久化方式实抡,要存儲的每個自定義對象都必須實現(xiàn)NSCoder定義的方法欠母,而開發(fā)人員必須負責保存和加載。如果只需幾個自定義對象就能滿足應(yīng)用的持久化需求吆寨,就可使用這種方式赏淌。
5.直接使用SQLite:應(yīng)用可使用C語言庫libsqlite直接與SQLite數(shù)據(jù)庫交互。SQLite是一種嵌入式關(guān)系數(shù)據(jù)庫啄清,不需要服務(wù)器六水,支持SQL92描述的大部分標準SQL語言。在iOS應(yīng)用中辣卒,使用SQLite可實現(xiàn)SQL支持的任何數(shù)據(jù)持久化邏輯缩擂,如定義數(shù)據(jù)庫表和關(guān)系、插入數(shù)據(jù)添寺、查詢數(shù)據(jù)以及更新和刪除數(shù)據(jù)胯盯。這種方式的缺點是,應(yīng)用需要在對象和SQL之間建立映射计露,需要編寫檢索和保存數(shù)據(jù)的SQL查詢博脑,還需要編寫代碼來跟蹤需要保存的對象。
6.Core Data:提供了直接使用SQLite的大部分靈活性票罐,同時應(yīng)用無需關(guān)系數(shù)據(jù)庫使用機制叉趣。如果應(yīng)用需要的數(shù)據(jù)很多、需要維護對象之間的關(guān)系或需要快速和輕松地訪問特定對象该押,Core Data可能是不錯的選擇疗杉。
二、Core Data托管對象
1.托管對象
托管對象是NSManagedObject實例蚕礼,應(yīng)用主要與之交互烟具。可將托管對象視為字典奠蹬,包含一組已知的鍵和對象類型(如字符串或數(shù)組)朝聋。可以像下面這樣訪問托管對象的特性
NSString *movieName = [myMOview valueForKey:@"movieName"];
要更新特性,可使用setValue:forKey.
[myMovie setValue:@"Casablanca" forkey:@"movieName"];
可將托管對象定義為NSManagedObject的子類,這樣就可以像訪問屬性那樣訪問特性.
[myMovie setMovieName:@"Casablanca"];
NSString *moviewName = [myMovie movieName];
NSManagedObject子類可包含自定義方法.例如,在存儲電影信息的托管對象中,可添加一個自定義方法,用于跟蹤電影被欣賞了多少次.這個方法可能將電影的"欣賞次數(shù)"特性加1,并將"最后欣賞日期"設(shè)置為當天.
可在托管對象之間建立關(guān)系.例如,在跟蹤電影收藏的應(yīng)用中,跟蹤電影是否借給了朋友可能很有用.為此,可在應(yīng)用中創(chuàng)建Movie和Friend對象,并在它們之間建立關(guān)系.
對象之間的關(guān)系可以是一對一的.如果電影應(yīng)用將每一部電影的海報圖像都存儲在一個獨立的對象中,就可以在電影和海報圖像之間建立一對一的關(guān)系.
[myMovie setValue:posterImageObject forKey:@"posterImage"];
NSManagedObject *movie = [posterImageObject valueForKey"@"relatedMovie"];
關(guān)系也可以是一對多的.例如,一部電影不能同時借給多位朋友,但一位朋友可同時借用多部電影.
[myMovie setValue:myFriend forKey:@"lentToFriend"];
[myOtherMovie setValue:myFriend forKey"@"lentToFriend"];
NSSet *borrowedMovies = [myFriend valueForKey"@"borrowedMovies"];