Swift-Core Data(1) 基礎(chǔ)存儲(chǔ)
Swift-Core Data(2) 基礎(chǔ)存儲(chǔ)
最近有做個(gè)小 demo,有使用到 Core Data,才開(kāi)始研究一下,把感覺(jué)比較有用的資料整理了一下炉爆。
1. Core Data 架構(gòu)
一個(gè)基本的 Core Data 棧由四個(gè)主要部分組成:
1.1NSManagedObjectContext (托管對(duì)象上下文 )
日常打交道的都是這個(gè)惑畴。其他三個(gè)在數(shù)據(jù)遷移的時(shí)候才會(huì)看到。
作用:插入數(shù)據(jù)匾嘱,查詢數(shù)據(jù)谈况,刪除數(shù)據(jù)
1.2NSManagedObject(托管對(duì)象)
是我們的數(shù)據(jù)模型勺美,也就是我們存儲(chǔ)的對(duì)象。這些對(duì)象都保存在NSManagedObjectContext中碑韵,每個(gè)存儲(chǔ)對(duì)象都知道自己對(duì)應(yīng)哪個(gè)上下文励烦。
作用:添加實(shí)體的屬性,建立屬性之間的關(guān)系
1.3NSPersistenStoreCoordinator (持久化存儲(chǔ)協(xié)調(diào)器)
是模型和存儲(chǔ)數(shù)據(jù)庫(kù)之間的橋梁泼诱,負(fù)責(zé)兩者之間最復(fù)雜的細(xì)節(jié)隱藏坛掠。
作用:設(shè)置數(shù)據(jù)存儲(chǔ)的名字,位置治筒,存儲(chǔ)方式屉栓,和存儲(chǔ)時(shí)機(jī)
1.4 NSPersistentStore(持久化存儲(chǔ))
Core Data 提供了四種類型,SQLite, Binary, XML, and In-Memory。在iOS的XML存儲(chǔ)不可用,這些都是在持久存儲(chǔ)的特征描述耸袜。所有的數(shù)據(jù)都存在這里友多。
- XML是將數(shù)據(jù)存為XML文件,只在 OS X 平臺(tái)下可用堤框。
- Binary的方法是存為一個(gè)Data文件域滥。
- InMemory的方式是不會(huì)對(duì)數(shù)據(jù)進(jìn)行真正意義上的持久化纵柿,全部存儲(chǔ)在內(nèi)存中,當(dāng)應(yīng)用程序退出時(shí)启绰,數(shù)據(jù)也就消失了昂儒。
2.創(chuàng)建一個(gè)Core Data Demo
1.創(chuàng)建項(xiàng)目
在 Xcode 創(chuàng)建工程時(shí),提供了創(chuàng)建 CoreData 的模板委可,只需要我們?cè)趧?chuàng)建時(shí)渊跋,勾選 CoreData 選項(xiàng),Xcode 就會(huì)自動(dòng)創(chuàng)建出數(shù)據(jù)模型文件着倾。
這個(gè)Demo用這個(gè)創(chuàng)建拾酝,只是簡(jiǎn)單的開(kāi)始了解 Coare Data。在今后的工作中不建議使用這種方式創(chuàng)建卡者,通常情況下我們都會(huì)把生成的模板代碼都刪除蒿囤,自己手寫代碼。
2. 創(chuàng)建本地?cái)?shù)據(jù)庫(kù)模板
項(xiàng)目創(chuàng)建好崇决,我們可以看到有一個(gè).xcdatamodeld文件材诽,這個(gè)就是咱們的數(shù)據(jù)庫(kù)模板。
然后點(diǎn)擊.xcdatamodeld文件嗽桩,添加實(shí)體岳守,修改實(shí)體名字(必須大寫字母開(kāi)頭)凄敢,為實(shí)體添加屬性(屬性必須以小寫字母開(kāi)頭)
對(duì)于每一個(gè)實(shí)體碌冶,build之后Xcode都會(huì)自動(dòng)幫我們生成相應(yīng)的實(shí)體類代碼,如果不想要自動(dòng)生成涝缝,可以選擇手動(dòng)生成扑庞,并且可以選擇手動(dòng)生成的語(yǔ)言,這里我們選擇 Manual/None
手動(dòng)生成實(shí)體類代碼的步驟:選擇xcdatamodeld文件-->editor-->Create NSManagedObject SubClass,然后按提示點(diǎn)擊就行了。最終你會(huì)在項(xiàng)目文件里面看到新生成的實(shí)體類代碼文件
之后按照提示走就可以拒逮。創(chuàng)建完成后得結(jié)果:
接下來(lái)就可以簡(jiǎn)單的使用了
3. 使用
這里只做了簡(jiǎn)單功能的使用,存儲(chǔ)數(shù)據(jù)和查看數(shù)據(jù),效果圖如下:3.1 存儲(chǔ)數(shù)據(jù)
存儲(chǔ)數(shù)據(jù)需要四步
1).獲取總代理和托管對(duì)象托管對(duì)象上下文
2).創(chuàng)建實(shí)體,獲取托管對(duì)象
3).將數(shù)據(jù)賦值給托管對(duì)象
4).保存到數(shù)據(jù)庫(kù)
//第一步:獲取總代理和托管對(duì)象托管對(duì)象上下文
let app = UIApplication.shared.delegate as? AppDelegate
let context = app?.persistentContainer.viewContext
//第二步:創(chuàng)建實(shí)體,獲取托管對(duì)象
let entity = NSEntityDescription.entity(forEntityName: "Student", in: context!)
let student = NSManagedObject(entity: entity!, insertInto: context) as! Student
//第三步:將數(shù)據(jù)賦值給托管對(duì)象
student.name = self.nameTF.text
student.age = Int32(self.ageTF.text!)!
//第四步:保存到數(shù)據(jù)庫(kù)罐氨。如果保存失敗,進(jìn)行處理
do {
try context?.save()
} catch {
fatalError("無(wú)法保存")
}
3.2 查詢數(shù)據(jù)
查詢數(shù)據(jù)需要三步
1).獲取總代理和托管對(duì)象托管對(duì)象上下文
2).建立一個(gè)獲取的請(qǐng)求
3).執(zhí)行請(qǐng)求
//第一步:獲取總代理和托管對(duì)象托管對(duì)象上下文
let app = UIApplication.shared.delegate as? AppDelegate
let context = app?.persistentContainer.viewContext
//第二步:建立一個(gè)獲取的請(qǐng)求
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Student")
//第三步:執(zhí)行請(qǐng)求
do {
//[Student] 這個(gè)位置填的是獲取對(duì)象的類型
//也可以使用 基類 NSManagedObject
let fetch = try context?.fetch(fetchRequest) as? [Student]
var resultStr:String = "查詢結(jié)果\n"
for student in fetch! {
resultStr.append("name:\(student.name!) age:\(student.age) \n")
}
self.resultTextView.text = resultStr
} catch {
fatalError("無(wú)法查詢")
}
這樣簡(jiǎn)單的存儲(chǔ)和查詢功能就完成了 .GitHub Demo