CoreData(一)

  • 參考書籍:CORE DATA by Tutorials
  • 默認(rèn)有swift基礎(chǔ)音羞。

最近一直在學(xué)習(xí)CoreData相關(guān)內(nèi)容,在這里做一個(gè)總結(jié),總結(jié)分篇組成津坑,以供自己和他人學(xué)習(xí)參考。

Core Data 是一個(gè)在OS X和iOS SDKs中對(duì)象圖形化管理以及持久化的框架傲霸。這意味著Core Data可以用來(lái)存儲(chǔ)以及獲取數(shù)據(jù)疆瑰,但這并不是一個(gè)關(guān)系型數(shù)據(jù)庫(kù)如同MySQL和SQLite。但是事實(shí)上Core Data使用的是SQLite來(lái)存儲(chǔ)數(shù)據(jù)的昙啄。我的理解是Core Data是蘋果對(duì)SQLite的進(jìn)一步升級(jí)穆役,使你可以不用關(guān)注數(shù)據(jù)的存儲(chǔ)而把重心放在對(duì)象的增刪改查。

這一篇主要內(nèi)容:

1梳凛、使用Xcode建立CoreData模型耿币。
2、添加數(shù)據(jù)韧拒。
3淹接、讀取數(shù)據(jù)。


(1)叛溢、建立模型

建立一個(gè)新工程塑悼,如下圖所示。


注意紅色選擇框的勾得勾選

Note:在xcode6中只有Master-Detail Application 和Single View Application這兩個(gè)模板有這個(gè)勾選框楷掉。

你會(huì)發(fā)現(xiàn)AppDelegate.swift文件中多出了一些代碼政勃,以及多了一個(gè)CoreDataTest1.xcdatamodeld文件懂诗。
AppDelegate.swift中多出的代碼暫且不用管他,在后面我們會(huì)用到。

點(diǎn)擊*.xcdatamodeld文件胖烛,點(diǎn)擊Add Entity按鈕添加Entity济舆,將其重新命名為Test涩嚣,在右邊的Attributes欄點(diǎn)擊加號(hào)赃梧,添加一個(gè)Attribute,并將type選擇為Sring墩虹。

  • Note:Entity的名字必須以大寫開頭

這樣你就添加了一個(gè)Entity實(shí)體嘱巾,叫做Test,這個(gè)實(shí)體有一個(gè)屬性名為name败晴,為String類型浓冒。在這里解釋一下這幾個(gè)名詞的意義:

  • Entity:相當(dāng)于coredata中的類。
  • Attribute:如果entity是類的話尖坤,attribute就是類的屬性稳懒,各自為不同類型。
    (還有一些其他屬性在后面的章節(jié)會(huì)介紹。)

通過(guò)以上操作我們就成功的創(chuàng)建了一個(gè)CoreData的Model场梆。


(2)墅冷、保存數(shù)據(jù)

為了方便演示,我們?nèi)∠鸄utoLayout或油,并拖入幾個(gè)UI控件寞忿,制作一個(gè)簡(jiǎn)單的Demo。

Add按鈕添加數(shù)據(jù)顶岸,show按鈕顯示數(shù)據(jù)

好的腔彰,接下來(lái)就是添加數(shù)據(jù)的相關(guān)操作。

首先辖佣,打開viewcontroller.swift霹抛,添加頭文件“import CoreData”。
然后卷谈,在addButton方法內(nèi)添加以下代碼:
<pre><code>
//1
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext!
//2
let entity = NSEntityDescription.entityForName("Test", inManagedObjectContext:
managedContext)
let test = NSManagedObject(entity: entity!, insertIntoManagedObjectContext:managedContext)
//3
let name = self.addTextField.text
test.setValue(name, forKey: "name")
//4
var error: NSError?
if !managedContext.save(&error) {
println("Could not save (error), (error?.userInfo)")
}
</code></pre>

讓我來(lái)解釋一下這一段代碼:

  • //1 在我們想要保存或者獲取任何數(shù)據(jù)之前我們必須獲取NSManagedObjectContext杯拐,你可以把這個(gè)東西理解為暫存器。
    (這個(gè)對(duì)象就是我們前面提到的AppDelegate中自動(dòng)生成的代碼之一世蔗,如果你在創(chuàng)建工程的時(shí)候勾選了‘Use Core Data’)
    我們通過(guò) Application.delegate 獲取了xcode自動(dòng)生成的‘暫存器’端逼。

  • //2 好的,經(jīng)過(guò)上一步我們擁有了一個(gè)暫存器污淋,現(xiàn)在我們想保存對(duì)象的首先得創(chuàng)造這個(gè)對(duì)象顶滩,這個(gè)對(duì)象是NSManagedObject類型的,通過(guò)初始化方法:
    init(entity:insertIntoManagedObjectContext:)
    這個(gè)方法給我們的entity也就是實(shí)體創(chuàng)建了一個(gè)能加入到‘暫存器’中的對(duì)象芙沥。

    NSEntityDescription.entityForName(entityName: String, inManagedObjectContext context: NSManagedObjectContext)
    

這個(gè)方法按照名字尋找到我們?cè)O(shè)定的entity诲祸,并且和我們的‘暫存器’連接起來(lái)浊吏。

  • //3 上一步我生成了一個(gè)NSManagedObject對(duì)象而昨,這個(gè)對(duì)象有一個(gè)屬性“name”,這一步做的就是給這個(gè)屬性賦值找田。
    test.setValue(name, forKey: "name")
    key-value大家應(yīng)該不會(huì)陌生歌憨。這樣,我們新創(chuàng)建的對(duì)象的屬性就有了值墩衙,這個(gè)值就是我們輸入到輸入框的值务嫡。
    到這一步,我們的entity有了值漆改,并且我們的entity已經(jīng)進(jìn)入添加到了‘暫存器’中心铃。
  • //4 我們前面一直在說(shuō)存到‘暫存器’中,既然是‘暫存器’挫剑,那么最后一步就是把‘暫存器’中的東西存到磁盤中去扣。保存的方法很簡(jiǎn)單:
    managedContext.save(&error)
    error是存盤發(fā)生錯(cuò)誤時(shí)產(chǎn)生錯(cuò)誤原因,一個(gè)好的app必須對(duì)各種error進(jìn)行處理樊破。

通過(guò)以上四步我們就成功將輸入到TextField中的字符串存到了磁盤中


(3)愉棱、讀取數(shù)據(jù)

這一部分我們的目標(biāo)是將前面存入磁盤的內(nèi)容再?gòu)拇疟P中讀出來(lái)唆铐,并在TextView中顯示。
在showButton方法中添加以下代碼:

<pre><code>
//1
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext!
//2
let fetchRequest = NSFetchRequest(entityName:"Test")
//3
var error: NSError?
let fetchedResults = managedContext.executeFetchRequest(fetchRequest, error: &error) as! [NSManagedObject]?
if let results = fetchedResults {
for each in results{
let name:String = each.valueForKey("name") as! String
self.showTextView.text = self.showTextView.text + name + "\n"
}
}else {
println("Could not fetch (error), (error!.userInfo)")
}
</code></pre>

  • //1 前面已經(jīng)說(shuō)過(guò)奔滑,不管是儲(chǔ)存還是讀取數(shù)據(jù)艾岂,首先得獲取managedObjectContext對(duì)象,獲取方法與之前相同朋其,通過(guò)Application delegate的方式獲取王浴。
  • //2 想要讀取數(shù)據(jù),第二步就是告訴系統(tǒng)想要的讀取數(shù)據(jù)的entity
    let fetchRequest = NSFetchRequest(entityName:"Test")
    NSFetchRequest這是對(duì)‘寄存器發(fā)出請(qǐng)求梅猿,告訴‘寄存器’’我們要獲取數(shù)據(jù)的實(shí)體叼耙。
  • //3 通過(guò)前兩步,我們已經(jīng)有了‘寄存器’粒没,以及想要獲取數(shù)據(jù)的實(shí)體的請(qǐng)求筛婉。那么這一步對(duì)‘寄存器’發(fā)出請(qǐng)求,就可以返回一個(gè)數(shù)組癞松,這個(gè)數(shù)組包括了所有符合要求的實(shí)體爽撒,每一個(gè)實(shí)體都是我么之前存進(jìn)去的對(duì)象。
    let fetchedResults = managedContext.executeFetchRequest(fetchRequest, error: &error) as! [NSManagedObject]?
    fetchedResults就是這個(gè)包含所有‘Test’對(duì)象的數(shù)組响蓉,我們用一個(gè)for in 函數(shù)將數(shù)組中的每一個(gè)對(duì)象都讀出來(lái)
    let name:String = each.valueForKey("name") as! String
    .valueForkey(String)函數(shù)可以將對(duì)象中的屬性的值讀出來(lái)
  • Nete:如果‘寄存器’中沒(méi)有這個(gè)實(shí)體的數(shù)據(jù)硕勿,也就是數(shù)組中沒(méi)有對(duì)象,那么我們獲取的fetchedResults數(shù)組是這樣的“[]”.
    但是如果請(qǐng)求發(fā)生了錯(cuò)誤枫甲,那么該方法返回的是一個(gè)nil源武,所以我們可以通過(guò)if let 來(lái)判斷是否發(fā)生了錯(cuò)誤,如果發(fā)生了錯(cuò)誤我們可以輸出error.userInfo來(lái)進(jìn)行一個(gè)提示想幻。

好的粱栖,我們通過(guò)以上操作就將數(shù)據(jù)讀取出來(lái)并顯示在了TextView中,我們來(lái)操作一下app脏毯,結(jié)果如下所示:

在上方輸入框輸入name闹究,點(diǎn)擊Add按鈕就添加到了數(shù)據(jù)庫(kù)中,點(diǎn)擊show按鈕就將已添加的name顯示在下方的TextView中

在以上內(nèi)容中我們學(xué)習(xí)了這些知識(shí)點(diǎn):

  • data models
  • entities
  • attributes
  • managed objects
  • managed object contexts
  • fetch requests.
    再來(lái)總結(jié)一下:
  • 儲(chǔ)存數(shù)據(jù):
    1食店、獲取‘暫存器’——NSManagedObjectContext渣淤。
    2、聲明想要儲(chǔ)存的實(shí)體對(duì)象NSManagedObject吉嫩。
    用test.setValue(name, forKey: "name")方法給聲明的實(shí)體對(duì)象的屬性賦值
    3价认、保存
  • 讀取數(shù)據(jù)
    1、獲取‘暫存器’——NSManagedObjectContext自娩。
    2用踩、創(chuàng)建請(qǐng)求NSFetchRequest
    3、
    managedContext.executeFetchRequest(fetchRequest, error: &error) as! [NSManagedObject]?
    方法返回?cái)?shù)據(jù),該數(shù)據(jù)是一個(gè)包括所有符合要求的實(shí)體對(duì)象的數(shù)組捶箱。
    如果發(fā)生錯(cuò)誤智什,方法返回nil。

這一篇中我們進(jìn)行了簡(jiǎn)單的存貯以及讀取操作丁屎,下一篇中我們會(huì)對(duì)CoreData進(jìn)行更多的操作荠锭。
源代碼已上傳github:https://github.com/superxlx/CoreDataTest1

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市晨川,隨后出現(xiàn)的幾起案子证九,更是在濱河造成了極大的恐慌,老刑警劉巖共虑,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件愧怜,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡妈拌,警方通過(guò)查閱死者的電腦和手機(jī)拥坛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)尘分,“玉大人猜惋,你說(shuō)我怎么就攤上這事∨喑睿” “怎么了著摔?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)定续。 經(jīng)常有香客問(wèn)我谍咆,道長(zhǎng),這世上最難降的妖魔是什么私股? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任摹察,我火速辦了婚禮,結(jié)果婚禮上庇茫,老公的妹妹穿的比我還像新娘港粱。我一直安慰自己,他們只是感情好旦签,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著寸宏,像睡著了一般宁炫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上氮凝,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天羔巢,我揣著相機(jī)與錄音,去河邊找鬼。 笑死竿秆,一個(gè)胖子當(dāng)著我的面吹牛启摄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播幽钢,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼歉备,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了匪燕?” 一聲冷哼從身側(cè)響起蕾羊,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎帽驯,沒(méi)想到半個(gè)月后龟再,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尼变,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年利凑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嫌术。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡截碴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蛉威,到底是詐尸還是另有隱情日丹,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布蚯嫌,位于F島的核電站哲虾,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏择示。R本人自食惡果不足惜束凑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望栅盲。 院中可真熱鬧汪诉,春花似錦、人聲如沸谈秫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)拟烫。三九已至该编,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間硕淑,已是汗流浹背课竣。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工嘉赎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人于樟。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓公条,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親迂曲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子靶橱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • iOS CoreData介紹和使用(以及一些注意事項(xiàng)) 最近花了一點(diǎn)時(shí)間整理了一下CoreData,對(duì)于經(jīng)常使用S...
    Pocket閱讀 22,950評(píng)論 34 92
  • CoreData簡(jiǎn)述 CoreData是ios系統(tǒng)推薦給我們的數(shù)據(jù)存儲(chǔ)方案奢米。在ios中數(shù)據(jù)存儲(chǔ)有多種方式抓韩,包括NS...
    刀客傳奇閱讀 3,869評(píng)論 4 12
  • CoreData是蘋果在數(shù)據(jù)存儲(chǔ)的親生兒子,是在Cocoa平臺(tái)上管理數(shù)據(jù)層模型和數(shù)據(jù)持久化的要數(shù)據(jù)庫(kù)框架鬓长,近年sw...
    Coder1eo閱讀 7,516評(píng)論 2 11
  • 有很多關(guān)于CoreData的文章谒拴,本文簡(jiǎn)單的介紹在應(yīng)用中集成和利用CoreData需要的組件以及CoreData的...
    海綿寶寶不要哭閱讀 830評(píng)論 0 7
  • 創(chuàng)建項(xiàng)目的時(shí)候勾選使用Coredata、工程里面會(huì)含有.xcdatamodeld結(jié)尾的文件涉波。點(diǎn)擊該文件后在右側(cè)視圖...
    xiaocheche閱讀 836評(píng)論 0 2