使用swift+coredata構(gòu)建簡易記賬軟件(1) 搭建骨架

本系列文章將講述如何使用swift+coredata構(gòu)建一個簡易的記賬軟件,第一版本將要滿足以下功能

  • 自定義賬本
    • 賬本名稱自定義
    • 賬本匯率自定義
  • 新建流水
    • 流水金額自定義
    • 流水時間自定義
    • 流水分類自定義
    • 流水注釋自定義
  • 顯示賬本列表
  • 顯示流水列表

作為本系列的第一篇文章,本文主要關(guān)注點(diǎn)在于

  • storyboard的繪制
  • coredata模型的建立

注:

  • 作者目前是一名學(xué)生,很多代碼可能并不是swift中的最佳實現(xiàn),歡迎各位在評論區(qū)探討
  • 本文面向?qū)ο蟛⒉皇菑牧汩_始的初學(xué)者,雖然作者在講解的時候力爭做到盡可能詳細(xì),還是希望閱讀者可以有一定的XCode的基礎(chǔ)和編程基礎(chǔ)
    推薦的視頻教材:
    斯坦福iOS公開課,去官網(wǎng)看最新版效果最佳

新建項目

使用coredata的iOS項目,為了避免后期配置的繁瑣,在新建項目的時候就簡易勾選使用coredata復(fù)選框,如下圖所示


新建項目

界面規(guī)劃

從最簡單的意義上來講,界面可以做成如下圖所示,具體每個頁面的實現(xiàn)我們放到后續(xù)的文章中去考慮


簡單的界面實現(xiàn)(太丑了能看就行)

主要是四個viewcontroller

  • MainViewController: 內(nèi)置一個tableViewController作為流水列表,以及一個添加流水的按鈕
  • AddCostViewController: 添加一個流水
  • AccountListViewController: 顯示目前所有的賬戶
  • AddAccountListViewController: 添加一個賬戶
    其中Main和Accountlist兩個控制器通過tab bar鏈接,后續(xù)文章將繼續(xù)按照這個最基本的界面模型來進(jìn)行搭建,技術(shù)為主,沒有美工

CoreData詳解

從iOS 10版本開始,蘋果提供了一個新的類來處理和coredata有關(guān)的類,他就是NSPersistentContainer,根據(jù)官方文檔:

NSPersistentContainer simplifies the creation and management of the Core Data stack by handling the creation of the managed object model (NSManagedObjectModel), persistent store coordinator (NSPersistentStoreCoordinator), and the managed object context (NSManagedObjectContext).

所以我們不必使用繁瑣的流程來初始化coredata棧,在appdelegate.m中你們應(yīng)該可以找到以下代碼來聲明persistentContainer和saveContext ()函數(shù) (注釋全部略去)

// MARK: - Core Data stack
lazy var persistentContainer: NSPersistentContainer = {
    let container = NSPersistentContainer(name: "RapidTallyBook")
    container.loadPersistentStores(completionHandler: { (storeDescription, error) in
        if let error = error as NSError? {
            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 {
            let nserror = error as NSError
            fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
        }
    }
}

以及在項目目錄中應(yīng)該可以找到以項目名稱命名的xcdatamodeld文件

在CoreData中創(chuàng)建表

coredata中表的創(chuàng)建十分容易,點(diǎn)擊xcdatamodeld文件,點(diǎn)擊左下方的Add Entity按鈕創(chuàng)建三個Entity,分別是

  • Account: 賬目
  • Category: 類別
  • Cost: 流水
    效果應(yīng)該如圖所示



    值得注意的是,每當(dāng)創(chuàng)建一個新的entity的時候,請選擇這個entity,到左邊的屬性編輯器中,將codegen選項變?yōu)镸anual/None,這是為了之后生成coredata class文件的時候避免出錯


    如圖所示,Codegen屬性已經(jīng)設(shè)置為Manual/None

    然后就可以對每一個entity添加attribute
  • Account
    • currency:string
    • name:string
  • Category
    • name:string
    • isHidden: bool
  • Cost
    • amount:Double
    • comment:string
    • createDate: Date
      之后構(gòu)建每個entity之間的關(guān)聯(lián)


      如圖所示,在Cost下建立了兩個外鍵

      值得注意的是,所有的relationship默認(rèn)都是To One的type,在建立這兩個外鍵的反射關(guān)聯(lián)的時候,請在左邊的屬性選項卡中把Type設(shè)置為ToMany

如果一切都沒有問題的話,現(xiàn)在你的表格結(jié)構(gòu)應(yīng)該如下

  • Account
    • currency:string
    • name:string
    • costs :to many field to Cost
  • Category
    • name:string
    • isHidden: bool
    • costs: to many field to Cost
  • Cost
    • amount:Double
    • comment:string
    • createDate: Date
    • account: to one field to Account
    • category: to one field to category

選擇頂部工具欄Editor - CreateNsmanagedObjectSubClass 選擇三個entity,然后選擇一個適當(dāng)?shù)牡胤酱鎯@些文件,一共會產(chǎn)生六個文件,這時候請cmd+B build一下你的工程,如果沒有問題,那么coredata的自動生成的文件就沒問題,如果有error,請檢查

  • 是否將codegen設(shè)置為manual or None, 這是一個已知的swift的bug,設(shè)置為這個選項可以暫時解決這個問題,修改設(shè)置后請全部刪除原來生成的六個文件再重新生成


    六個文件應(yīng)該類似于這樣

    注:不建議手動修改這六個文件的任何一個,任何修改都建議放在一個新的swift文件中extend原有的類

下篇文章展望:

這篇文章的難點(diǎn)在于coredata在自動生成類文件,會有或大或小很多坑,希望讀者在遇到問題時可以在評論區(qū)與我探討,swift對coredata的支持并沒有像objc那么完善,遇到問題是十分正常的
下一篇文章將會著眼于與coredata的交互,包括

  • 在表中新建數(shù)據(jù)
  • 修改表中的數(shù)據(jù)
  • 在表中查詢

具體到業(yè)務(wù)邏輯上講,在于

  • 新建一個新的account
  • 展示已有的account

本人尚才疏學(xué)淺,有任何問題和建議歡迎指教
水母程序員
2018.08.12

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容