CoreData基本概念
CoreData蘋果自己推出的數(shù)據(jù)存儲(chǔ)框架黍檩,以面向?qū)ο蠓绞絻?chǔ)存和管理數(shù)據(jù)(提供面向?qū)ο蟮慕涌冢苯硬僮鲗?duì)象怖喻,不必操作SQL語(yǔ)句)如孝。提供對(duì)象關(guān)系映射功能(ORM),可以將OC對(duì)象轉(zhuǎn)化為數(shù)據(jù)保存在SQLite3數(shù)據(jù)庫(kù)文件中常熙,也能將保存在數(shù)據(jù)庫(kù)中的數(shù)據(jù)還原成OC對(duì)象纬乍。官方支持,與iOS結(jié)合更緊密裸卫。
可以實(shí)現(xiàn)多種文件格式: * NSSQLiteStoreType 仿贬、 * NSBinaryStoreType 、* NSInMemoryStoreType 彼城、* NSXMLStoreTyp诅蝶。
NSManagedObjectContext:
托管對(duì)象上下文,直接負(fù)責(zé)數(shù)據(jù)的增刪改查NSManagedObjectModel
托管對(duì)象模型募壕,其中一個(gè)托管對(duì)象模型關(guān)聯(lián)到一個(gè)模型文件调炬,里面存儲(chǔ)著數(shù)據(jù)庫(kù)的數(shù)據(jù)結(jié)構(gòu)。NSPersistentStoreCoordinator
持久化存儲(chǔ)協(xié)調(diào)器舱馅,主要負(fù)責(zé)協(xié)調(diào)上下文與存儲(chǔ)的區(qū)域的關(guān)系缰泡。NSManagedObject
托管對(duì)象類,托管對(duì)象都會(huì)繼承此類代嗤。被管理的數(shù)據(jù)記錄.NSEntityDescription 獲取一張表對(duì)應(yīng)的entity
NSFetchRequest 查詢請(qǐng)求
NSPredicate 查詢的條件
NSSortDescriptor 查詢的排序條件
關(guān)聯(lián)對(duì)象的分類中棘钞,@dynamic修飾變量,coredata會(huì)在運(yùn)行時(shí)將數(shù)據(jù)對(duì)象的屬性生成setter干毅、getter方法宜猜。自己寫該關(guān)鍵字,只是推到運(yùn)行時(shí)硝逢,沒(méi)實(shí)現(xiàn)會(huì)報(bào)錯(cuò)姨拥。
CoreData操作流程
1、首先創(chuàng)建一個(gè)coreData 模型文件:系統(tǒng)創(chuàng)建或者自己創(chuàng)建
2渠鸽、在data Model 中創(chuàng)建項(xiàng)目中需要用到的實(shí)體(Entities)叫乌,首字母大寫
Integer 16:代表整數(shù),范圍是-32768 ~ 32767
Integer 32:代表整數(shù)徽缚,范圍是-2147483648 ~ 2147483647
Integer 64:代表整數(shù)憨奸,范圍是–9223372036854775808 ~ 9223372036854775807,還是很大的凿试,較少用
3排宰、生成對(duì)應(yīng)實(shí)體的實(shí)體類(實(shí)體codegen改為manual似芝,codeGeneration下language改為oc)
4、自己創(chuàng)建模型文件時(shí)需要手動(dòng)生成上下文额各,關(guān)聯(lián)數(shù)據(jù)庫(kù)
//NSMainQueueConcurrencyType:代表主并發(fā)隊(duì)列類型国觉,如果在操作過(guò)程中,需要涉及到UI操作虾啦,則應(yīng)該使用這個(gè)參數(shù)初始化上下文完成操作麻诀。
//NSPrivateQueueConcurrencyType:代表私有并發(fā)隊(duì)列的類型,操作也是在子線程中完成的傲醉。
NSManagedObjectContext *context = [[NSManagedObjectContext alloc]
initWithConcurrencyType:NSMainQueueConcurrencyType];
5蝇闭、查詢語(yǔ)句
/* 謂詞的條件指令
1.比較運(yùn)算符 > 、< 硬毕、== 呻引、>= 、<= 吐咳、!=
例:@"number >= 99"
2.范圍運(yùn)算符:IN 逻悠、BETWEEN
例:@"number BETWEEN {1,5}"
@"address IN {'shanghai','nanjing'}"
3.字符串本身:SELF
例:@"SELF == 'APPLE'"
4.字符串相關(guān):BEGINSWITH、ENDSWITH韭脊、CONTAINS(模糊查詢)
例: @"name CONTAIN[cd] 'ang'" //包含某個(gè)字符串
@"name BEGINSWITH[c] 'sh'" //以某個(gè)字符串開(kāi)頭
@"name ENDSWITH[d] 'ang'" //以某個(gè)字符串結(jié)束
5.通配符:LIKE
例:@"name LIKE[cd] '*er*'" //*代表通配符,Like也接受[cd].
@"name LIKE[cd] '???er*'"
*注*: 星號(hào) "*" : 代表0個(gè)或多個(gè)字符
問(wèn)號(hào) "?" : 代表一個(gè)字符
6.正則表達(dá)式:MATCHES
例:NSString *regex = @"^A.+e$"; //以A開(kāi)頭童谒,e結(jié)尾
@"name MATCHES %@",regex
注:[c]*不區(qū)分大小寫 , [d]不區(qū)分發(fā)音符號(hào)即沒(méi)有重音符號(hào), [cd]既不區(qū)分大小寫,也不區(qū)分發(fā)音符號(hào)沪羔。
7. 合計(jì)操作
ANY饥伊,SOME:指定下列表達(dá)式中的任意元素。比如蔫饰,ANY children.age < 18琅豆。
ALL:指定下列表達(dá)式中的所有元素。比如篓吁,ALL children.age < 18茫因。
NONE:指定下列表達(dá)式中沒(méi)有的元素。比如杖剪,NONE children.age < 18节腐。它在邏輯上等于NOT (ANY ...)。
IN:等于SQL的IN操作摘盆,左邊的表達(dá)必須出現(xiàn)在右邊指定的集合中。比如饱苟,name IN { 'Ben', 'Melissa', 'Nick' }孩擂。
提示:
1. 謂詞中的匹配指令關(guān)鍵字通常使用大寫字母
2. 謂詞中可以使用格式字符串
3. 如果通過(guò)對(duì)象的key
path指定匹配條件,需要使用%K
*/
//創(chuàng)建查詢請(qǐng)求
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Student"];
//查詢條件
NSPredicate *pre = [NSPredicate predicateWithFormat:@"sex = %@", @"美女"];
request.predicate = pre;
// 從第幾頁(yè)開(kāi)始顯示
// 通過(guò)這個(gè)屬性實(shí)現(xiàn)分頁(yè)
//request.fetchOffset = 0;
// 每頁(yè)顯示多少條數(shù)據(jù)
//request.fetchLimit = 6;
//發(fā)送查詢請(qǐng)求
NSArray *resArray = [_context executeFetchRequest:request error:nil];
6箱熬、數(shù)據(jù)遷移
凡是會(huì)引起NSManagedObjectModel托管對(duì)象模型變化的类垦,都最好進(jìn)行數(shù)據(jù)遷移狈邑,防止用戶升級(jí)應(yīng)用之后就閃退。
會(huì)引起NSManagedObjectModel托管對(duì)象模型變化的有以下幾個(gè)操作蚤认,新增了一張表米苹,新增了一張表里面的一個(gè)實(shí)體,新增一個(gè)實(shí)體的一個(gè)屬性砰琢,把一個(gè)實(shí)體的某個(gè)屬性遷移到另外一個(gè)實(shí)體的某個(gè)屬性里面…………
NSMigratePersistentStoresAutomaticallyOption = YES蘸嘶,那么Core Data會(huì)試著把之前低版本的出現(xiàn)不兼容的持久化存儲(chǔ)區(qū)遷移到新的模型中,
Core Data就能識(shí)別出是新表陪汽,就會(huì)更新為新表的存儲(chǔ)區(qū)训唱。
NSInferMappingModelAutomaticallyOption = YES,這個(gè)參數(shù)的意義是Core Data會(huì)根據(jù)自己認(rèn)為最合理的方式去嘗試MappingModel,
從源模型實(shí)體的某個(gè)屬性挚冤,映射到目標(biāo)模型實(shí)體的某個(gè)屬性况增。
只要打開(kāi)上面2個(gè)參數(shù),Core Data就會(huì)執(zhí)行自己的輕量級(jí)遷移了训挡。