Swift CoreData的使用

一、Core Data介紹

1晓猛、Core Data是iOS5之后才出現(xiàn)的一個(gè)數(shù)據(jù)持久化存儲(chǔ)框架饿幅,它提供了對(duì)象-關(guān)系映射(ORM)的功能,即能夠?qū)?duì)象轉(zhuǎn)化成數(shù)據(jù)戒职,也能夠?qū)⒈4嬖跀?shù)據(jù)庫中的數(shù)據(jù)還原成對(duì)象栗恩。
2、雖然其底層也是由類似于SQL的技術(shù)來實(shí)現(xiàn)洪燥,但我們不需要編寫任何SQL語句磕秤,有點(diǎn)像Java開發(fā)中的Hibernate持久化框架
3、Core Data數(shù)據(jù)最終的存儲(chǔ)類型可以是:SQLite數(shù)據(jù)庫捧韵,XML市咆,二進(jìn)制,內(nèi)存里再来,或自定義數(shù)據(jù)類型蒙兰。
4、與SQLite區(qū)別:只能取出整個(gè)實(shí)體記錄芒篷,然后分解搜变,之后才能得到實(shí)體的某個(gè)屬性。

二针炉、Core Data的使用準(zhǔn)備 - 數(shù)據(jù)模型和實(shí)體類的創(chuàng)建

1挠他、創(chuàng)建項(xiàng)目的時(shí)候,勾選“Use Core Data”篡帕。完畢后在 AppDelegate 中殖侵,會(huì)生成相關(guān)代碼。

CoreData項(xiàng)目創(chuàng)建.png

2镰烧、打開項(xiàng)目中的 xcdatamodeld 文件愉耙,在右邊的數(shù)據(jù)模型編輯器的底部工具欄點(diǎn)擊 Add Entity 添加實(shí)體。
同時(shí)在屬性欄中對(duì)實(shí)體命名進(jìn)行修改拌滋,并在 Attribute 欄目中添加屬性朴沿。

3、點(diǎn)擊下方的 Editor Style 按鈕可以查看實(shí)體的關(guān)系圖败砂。

創(chuàng)建coreData代碼.png

4赌渣、自 iOS10 和 swift3 之后,訪問 CoreData 的方法簡(jiǎn)潔了許多昌犹,我們不再需要手動(dòng)新建對(duì)應(yīng)于 entity 的 class坚芜。

三、Core Data的使用

1斜姥、首先在代碼中引入CoreData庫

import CoreData

2鸿竖、插入(保存)數(shù)據(jù)操作

/// 添加數(shù)據(jù)
func addData()
{
    //獲取管理的數(shù)據(jù)上下文 對(duì)象
    let app = UIApplication.shared.delegate as! AppDelegate
    let context = app.persistentContainer.viewContext

    //創(chuàng)建User對(duì)象
    let user = NSEntityDescription.insertNewObject(forEntityName: "User",
                                                   into: context) as! User

    //對(duì)象賦值
    user.id = 1
    user.userName = "hangge"
    user.password = "1234"

    //保存
    do {
        try context.save()
        print("保存成功沧竟!")
    } catch {
        fatalError("不能保存:\(error)")
    }
}

3、查詢數(shù)據(jù)操作

/// 查詢數(shù)據(jù)
func queryData()
{
    //獲取管理的數(shù)據(jù)上下文 對(duì)象
    let app = UIApplication.shared.delegate as! AppDelegate
    let context = app.persistentContainer.viewContext

    //聲明數(shù)據(jù)的請(qǐng)求
    let fetchRequest = NSFetchRequest<User>(entityName:"User")
    fetchRequest.fetchLimit = 10 //限定查詢結(jié)果的數(shù)量
    fetchRequest.fetchOffset = 0 //查詢的偏移量

    //設(shè)置查詢條件
    let predicate = NSPredicate(format: "id= '1' ", "")
    fetchRequest.predicate = predicate

    //查詢操作
    do {
        let fetchedObjects = try context.fetch(fetchRequest)

        //遍歷查詢的結(jié)果
        for info in fetchedObjects{
            print("id=\(info.id)")
            print("username=\(info.userName)")
            print("password=\(info.password)")
        }
    }
    catch {
        fatalError("不能保存:\(error)")
    }
}

4缚忧、修改數(shù)據(jù)操作

/// 修改數(shù)據(jù)操作
func modifyData()
{
    //獲取管理的數(shù)據(jù)上下文 對(duì)象
    let app = UIApplication.shared.delegate as! AppDelegate
    let context = app.persistentContainer.viewContext

    //聲明數(shù)據(jù)的請(qǐng)求
    let fetchRequest = NSFetchRequest<User>(entityName:"User")
    fetchRequest.fetchLimit = 10 //限定查詢結(jié)果的數(shù)量
    fetchRequest.fetchOffset = 0 //查詢的偏移量

    //設(shè)置查詢條件
    let predicate = NSPredicate(format: "id= '1' ", "")
    fetchRequest.predicate = predicate

    //查詢操作
    do {
        let fetchedObjects = try context.fetch(fetchRequest)

        //遍歷查詢的結(jié)果
        for info in fetchedObjects{
            //修改密碼
            info.password = "abcd"
            //重新保存
            try context.save()
        }
    }
    catch {
        fatalError("不能保存:\(error)")
    }
}

5悟泵、刪除數(shù)據(jù)操作

/// 刪除數(shù)據(jù)操作
func deleteData()
{
    //獲取管理的數(shù)據(jù)上下文 對(duì)象
    let app = UIApplication.shared.delegate as! AppDelegate
    let context = app.persistentContainer.viewContext

    //聲明數(shù)據(jù)的請(qǐng)求
    let fetchRequest = NSFetchRequest<User>(entityName:"User")
    fetchRequest.fetchLimit = 10 //限定查詢結(jié)果的數(shù)量
    fetchRequest.fetchOffset = 0 //查詢的偏移量

    //設(shè)置查詢條件
    let predicate = NSPredicate(format: "id= '1' ", "")
    fetchRequest.predicate = predicate

    //查詢操作
    do {
        let fetchedObjects = try context.fetch(fetchRequest)

        //遍歷查詢的結(jié)果
        for info in fetchedObjects{
            //刪除對(duì)象
            context.delete(info)
        }

        //重新保存-更新到數(shù)據(jù)庫
        try! context.save()
    }
    catch {
        fatalError("不能保存:\(error)")
    }
}

附:項(xiàng)目并未在創(chuàng)建時(shí)勾選coreData手動(dòng)添加 Cord Data 支持

(1)首先在項(xiàng)目中創(chuàng)建一個(gè) xcdatamodeld 文件(Data Model)。

image.png

(2)文件名建議與項(xiàng)目名一致

(3)接著打開 AppDelegate.swift闪水,在里面添加 Core Data 相關(guān)的支持方法(黃色部分)

import UIKit
import CoreData

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {



    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        return true
    }

    // MARK: UISceneSession Lifecycle

    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        // Called when a new scene session is being created.
        // Use this method to select a configuration to create the new scene with.
        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
    }

    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
        // Called when the user discards a scene session.
        // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
        // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
    }

    // MARK: - Core Data stack

    lazy var persistentContainer: NSPersistentContainer = {
        /*
         The persistent container for the application. This implementation
         creates and returns a container, having loaded the store for the
         application to it. This property is optional since there are legitimate
         error conditions that could cause the creation of the store to fail.
        */
        let container = NSPersistentContainer(name: "CoreDataDemo")
        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                // Replace this implementation with code to handle the error appropriately.
                // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
                 
                /*
                 Typical reasons for an error here include:
                 * The parent directory does not exist, cannot be created, or disallows writing.
                 * The persistent store is not accessible, due to permissions or data protection when the device is locked.
                 * The device is out of space.
                 * The store could not be migrated to the current model version.
                 Check the error message to determine what the actual problem was.
                 */
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
        return container
    }()

    // MARK: - Core Data Saving support

    func saveContext () {
        let context = persistentContainer.viewContext
        if context.hasChanges {
            do {
                try context.save()
            } catch {
                // Replace this implementation with code to handle the error appropriately.
                // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
                let nserror = error as NSError
                fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
            }
        }
    }

}

(4)經(jīng)過上面的配置后糕非,現(xiàn)在的項(xiàng)目就可以使用 CoreData 了

參考:

https://www.hangge.com/blog/cache/detail_767.html
https://www.hangge.com/blog/cache/detail_1841.html#

END

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市球榆,隨后出現(xiàn)的幾起案子朽肥,更是在濱河造成了極大的恐慌,老刑警劉巖持钉,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件衡招,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡每强,警方通過查閱死者的電腦和手機(jī)蚁吝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舀射,“玉大人,你說我怎么就攤上這事怀伦〈嘌蹋” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵房待,是天一觀的道長(zhǎng)邢羔。 經(jīng)常有香客問我,道長(zhǎng)桑孩,這世上最難降的妖魔是什么拜鹤? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮流椒,結(jié)果婚禮上敏簿,老公的妹妹穿的比我還像新娘。我一直安慰自己宣虾,他們只是感情好惯裕,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绣硝,像睡著了一般蜻势。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鹉胖,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天握玛,我揣著相機(jī)與錄音够傍,去河邊找鬼。 笑死挠铲,一個(gè)胖子當(dāng)著我的面吹牛冕屯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播市殷,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼愕撰,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了醋寝?” 一聲冷哼從身側(cè)響起搞挣,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎音羞,沒想到半個(gè)月后囱桨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嗅绰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年舍肠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窘面。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡翠语,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出财边,到底是詐尸還是另有隱情肌括,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布酣难,位于F島的核電站谍夭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏憨募。R本人自食惡果不足惜紧索,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望菜谣。 院中可真熱鬧珠漂,春花似錦、人聲如沸尾膊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽眯停。三九已至济舆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間莺债,已是汗流浹背滋觉。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國打工签夭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人椎侠。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓第租,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親我纪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子慎宾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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