可視化建模--CoreData

想要實現(xiàn)可視化建模扇谣,需要New File,選擇Core Data>Data Model闲昭,建立模型罐寨,模型名稱,最好與工程名相同

一序矩、對象與實體的映射

對象(Object)與數(shù)據(jù)庫的實體(Entity)對應
對象與實體都擁有屬性(Attribute)
CoreData.png
@圖片是二進制文件

二鸯绿、創(chuàng)建托管對象

一旦使用CoreData,必須要把對象置于CoreData框架托管

在當前創(chuàng)建的可視化模型中簸淀,在其屬性的Class > Name,加上MO瓶蝴,這樣,在Build工程后租幕,會自動創(chuàng)建name+MO的托管對象 的類定義舷手,但文件是不可見的

//由于此時 不需要再沒次都用代碼寫數(shù)據(jù),數(shù)據(jù)源可以留空
var areas : [AreaMO] = []

三令蛉、保存數(shù)據(jù)的步驟

iOS10中大幅度簡化了Core Data用法聚霜,保存數(shù)據(jù)只需要2步
3.1狡恬、類似一下代碼,創(chuàng)建一個AreaMO實例蝎宇,設置屬性
var area: AreaMO!
3.2弟劲、調(diào)用AppDelegate中的saveContext方法
@IBAction func saveTap(_ sender: UIBarButtonItem) {
        
        //獲取appDelegate
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        
        //Core Data持久化容器中的context
        area = AreaMO(context: appDelegate.persistentContainer.viewContext)
        area.name = tfName.text
        area.province = tfProvince.text
        area.part = tfPart.text
        area.visited = isVisited
        
        //圖片轉為 JPG格式
        if let imageData = UIImageJPEGRepresentation(coverImageView.image!, 0.7) {
            area.thumbImage = NSData(data: imageData) as Data
        }
        
        //保存并返回首頁
        print("正在保存")
        appDelegate.saveContext()
        performSegue(withIdentifier: "unwindToHomeList", sender: self)
    }

四、讀取保存的數(shù)據(jù)

// MARK: - 寫一個獲取所有Area Entity下數(shù)據(jù)的方法
    func fetchAllData() {
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        
        //do-try-catch錯誤處理
        do {
            //AreaMO.fetchRequest() 獲取AreaMO此Entity的所有條目
            
            areas = try appDelegate.persistentContainer.viewContext.fetch(AreaMO.fetchRequest())
        } catch  {
            print(error)
        }
        
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(true)
        
        //放在viewDidAppear里執(zhí)行
        fetchAllData()
        tableView.reloadData()

    }

五姥芥、高效刷新:

沒次全部更新tableView兔乞,性能上是不可接受的
能達到以下效果再好不過

加一條,出現(xiàn)一條
刪一條凉唐,少一條

NSFetchedResultsController
可把單元格內(nèi)容與數(shù)據(jù)進行綁定庸追,響應數(shù)據(jù)變化
@第一步:
import CoreData
@第二步:
遵從NSFetchedResultsControllerDelegate協(xié)議
此協(xié)議提供數(shù)據(jù)變化時的通知及代理的方法
@第三步:
定義一個NSFetchedResultsController變量
var fc : NSFetchedResultsController<AreaMO>!
@主體代碼:
func fetchAllData2() {
        //請求結果是AreaMO
        let request : NSFetchRequest<AreaMO> = AreaMO.fetchRequest()
        //NSSortDescriptor指定請求結果如何排序
        let sd = NSSortDescriptor(key: "name", ascending: true)
        request.sortDescriptors = [sd]
        
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        let context = appDelegate.persistentContainer.viewContext
        //NSFetchedResultsController初始化后,指定代理
        fc = NSFetchedResultsController(fetchRequest: request, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
        fc.delegate = self
        
        //執(zhí)行查詢台囱,將結果保存到數(shù)組中
        do {
            try fc.performFetch()
            if let objects = fc.fetchedObjects {
                areas = objects
                
            }
        } catch {
            print(error)
        }
        //如果執(zhí)行淡溯,會顯示上一次保存的數(shù)據(jù),但新增數(shù)據(jù)后簿训,表格不會更新
        
    }

六咱娶、代理方法

當數(shù)據(jù)內(nèi)容發(fā)生變化時,NSFetchedResultsControllerDelegate協(xié)議的以下方法會被調(diào)用:

//當控制器開始處理內(nèi)容變化時
    func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
       tableView.beginUpdates()
    }
    //內(nèi)容發(fā)生變更時
    func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
       
        switch type {
        case .delete:
            tableView.deleteRows(at: [indexPath!], with: .automatic)
        case .insert:
            tableView.insertRows(at: [newIndexPath!], with: .automatic)
        case .update:
            tableView.reloadRows(at: [indexPath!], with: .automatic)
        default:
            tableView.reloadData()
        }
        
        if let objects = controller.fetchedObjects {
            areas = objects as! [AreaMO]
        }
    }
    //當控制器已經(jīng)處理完內(nèi)容變更時
    func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
        tableView.endUpdates()
    }

七强品、真正的刪除

@修改之前tableView的刪除方法
            self.areas.remove(at: indexPath.row)
            let appDelegate = UIApplication.shared.delegate as! AppDelegate
            let context = appDelegate.persistentContainer.viewContext
            context.delete(self.fc.object(at: indexPath))
            appDelegate.saveContext()

//            此處需要注釋掉膘侮,因為我們已經(jīng)控制了數(shù)據(jù)庫的刪除
//            tableView.deleteRows(at: [indexPath], with: .fade)
@然后更新對象
reviewVC.ratingCloser = { (value:String) -> Void in
            self.area.rating = value
            self.RatingBtn.setImage(UIImage(named: value), for: .normal)
                
        }
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.saveContext()
        
@重新讀取
if let rating = area.rating {
   self.RatingBtn.setImage(UIImage(named: rating), for: .normal)
}
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市的榛,隨后出現(xiàn)的幾起案子琼了,更是在濱河造成了極大的恐慌,老刑警劉巖夫晌,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雕薪,死亡現(xiàn)場離奇詭異,居然都是意外死亡慷丽,警方通過查閱死者的電腦和手機蹦哼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來要糊,“玉大人纲熏,你說我怎么就攤上這事〕恚” “怎么了局劲?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵亡脸,是天一觀的道長屯仗。 經(jīng)常有香客問我,道長联逻,這世上最難降的妖魔是什么毅戈? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任苹丸,我火速辦了婚禮愤惰,結果婚禮上,老公的妹妹穿的比我還像新娘赘理。我一直安慰自己宦言,他們只是感情好,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布商模。 她就那樣靜靜地躺著奠旺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪施流。 梳的紋絲不亂的頭發(fā)上响疚,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機與錄音瞪醋,去河邊找鬼忿晕。 笑死,一個胖子當著我的面吹牛银受,可吹牛的內(nèi)容都是我干的杏糙。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蚓土,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了赖淤?” 一聲冷哼從身側響起蜀漆,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎咱旱,沒想到半個月后确丢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡吐限,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年鲜侥,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诸典。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡描函,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出狐粱,到底是詐尸還是另有隱情舀寓,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布肌蜻,位于F島的核電站互墓,受9級特大地震影響,放射性物質發(fā)生泄漏蒋搜。R本人自食惡果不足惜篡撵,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一判莉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧育谬,春花似錦券盅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至宿刮,卻和暖如春互站,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背僵缺。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工胡桃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人磕潮。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓翠胰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親自脯。 傳聞我的和親對象是個殘疾皇子之景,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,101評論 1 32
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結構(3).初始化時...
    歐辰_OSR閱讀 29,385評論 8 265
  • 1、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明先生_X自主閱讀 15,980評論 3 119
  • 你是不是曾經(jīng)為了敬一個人的酒膏潮,而跑去敬一桌人的酒锻狗?然后,獨自傷感…… ...
    沫清風閱讀 206評論 0 1
  • 看了一些文章焕参,覺得寫寫文字還是比較好的轻纪,突發(fā)奇想:命運是什么,是他想讓你去哪就去哪叠纷,讓你干什么就干什么的幕后導演刻帚,...
    美美的旭閱讀 195評論 0 0