本文介紹通過CoreData實現(xiàn)表視圖界面數(shù)據(jù)的存儲和通過NSFetchedResultsController更新表視圖的數(shù)據(jù)矩动,例子為一個表視圖界面的照片管理器勺三,界面如下隧膘。
完整代碼見文章末尾囤采。
要向項目中引入Core Data述呐,先添加一個新的Data Model文件,如下蕉毯,我給它命名為DataModel乓搬。
向新建的DataModel添加一個entity思犁,我給它命名為Item,并向其添加兩個屬性photoDescription和photoID缤谎,分別設置類型如圖抒倚。
因為每個表格條目的圖片可有也可無,photoID設置為可選類型坷澡,勾選其Attribute->Properties->Optional托呕。
點擊剛剛創(chuàng)建的實體Item,可以看到频敛,這個實體為NSManagedObject類项郊,也就是說,每當你從Core Data中取出一個Item斟赚,它返回給你的是NSManagedObject類型的對象着降。
現(xiàn)在我們給Item實體創(chuàng)建屬于它自己的類,點擊菜單欄->Editor->Create NSManagedObject Subclass拗军。選中先前創(chuàng)建的DataModel任洞。
選中Item實體。
下一步发侵,勾選Use scalar properties for primitive data types選項交掏。
創(chuàng)建完成后,項目中會增加兩個文件刃鳄。
其中Item類繼承了NSManagedObject類盅弛,而Location+CoreDataProperties.swift文件中的Item前有個extension關鍵詞。有了這個extension叔锐,我們就可以在已存在的Item類中添加額外的代碼挪鹏。
加載我們的表視圖數(shù)據(jù)并將其連接到SQLite數(shù)據(jù)存儲區(qū),需要用到NSManagedObjectContext愉烙。打開AppDelegate讨盒,添加以下代碼:
1處 我們先前建立的Core Data Model存放在了我們的app Bundle里,現(xiàn)在我們建立一個modelURL常量來存放它的url地址步责。
2處 用上面找到的url地址創(chuàng)建一個NSManagedObjectModel返顺,它相當于我們的數(shù)據(jù)模型。
3處 由于應用的數(shù)據(jù)是存放在應用文件夾里的SQLite數(shù)據(jù)庫中的勺择,這里我們首先建立常量urls找到應用的文件目錄,再建立一個指向數(shù)據(jù)庫文件的storeURL常量伦忠。
4處 創(chuàng)建NSPersistentStoreCoordinator對象省核,該對象用來管理SQLite數(shù)據(jù)庫。
5處 將SQLite數(shù)據(jù)庫連接所創(chuàng)建的NSPersistentStoreCoordinator對象昆码,使得該對象可以設置數(shù)據(jù)存儲的名字气忠,位置等等邻储。
6處 創(chuàng)建并返回NSManagedObjectContext對象。
通常我們通過修改NSManagedObjectContext對象來改變Core Data里存放的數(shù)據(jù)旧噪。由于例子中兩個視圖控制器(分別為MainViewController和ItemDetailViewController)都涉及到數(shù)據(jù)的變更吨娜,為此兩個視圖控制器中都要定義NSManagedObjectContext對象并且從AppDelegate傳遞過去。
上面我們已經(jīng)在兩個視圖控制器中定義了managedObjectContext淘钟,接下來就要實現(xiàn)三個文件(MainTableViewController.swift,ItemDetailViewController.swift,AppDelegate.swift) 中managedObjectConext的關聯(lián)了宦赠。
-
首先將AppDelegate中的managedObjectConext傳遞給MainTableViewController,我們在應用啟動時執(zhí)行的方法中實現(xiàn)米母,代碼如下勾扭。
CoreData12.png -
然后將MainTableViewController獲取到的managedObjectConext傳遞給ItemDetailViewController,由于后者是通過segue觸發(fā)的铁瞒,所以我們在前者的prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)方法中實現(xiàn)妙色,代碼如下:
CoreData11.png
截至目前,一切已經(jīng)準備就緒慧耍,接下來就是數(shù)據(jù)的裝載身辨。
為了讓數(shù)據(jù)顯示在表格視圖控制器中,我們定義一個NSFetchedResultsController用于從數(shù)據(jù)存儲區(qū)抓取數(shù)據(jù)并顯示在TableView中芍碧。
1處
2處
3處
4處
有了fetchedResultsController后煌珊,我們就可以讓它干活了,在viewDidLoad()中添加如下代碼:
這樣每次表格視圖控制器刷新师枣,fetchedResultsController都從數(shù)據(jù)存儲區(qū)中抓取數(shù)據(jù)怪瓶。
接下來完善MainTableViewController的數(shù)據(jù)源。
新建一個.swift文件践美,命名為MainTableViewController+NSFetchResult.swift洗贰。我們將會在這個文件中實現(xiàn)NSFetchedResultsController的委托方法。每當有數(shù)據(jù)插入陨倡,刪除敛滋,更新或者是移動了,NSFetchedResultsController都會觸發(fā)對應的方法讓TableView知道兴革,這樣以來TableView對應地插入绎晃,刪除或者更新行。
這里所有的代碼都可以直接放入MainTableViewController類中杂曲,另外建立一個文件只是為了讓代碼結(jié)構更清晰庶艾。
為了讓tableView能響應用戶的手勢刪除對應的行,我們在TableView的DataSource區(qū)域加入以下代碼:
到此為止擎勘,MainTableViewController的構建已經(jīng)完成了咱揍。最后我們來填充ItemDetailViewController。
由于我們要將添加的照片放入數(shù)據(jù)存儲區(qū)中棚饵,所以要先將選中的照片傳遞到done函數(shù)中煤裙。
點按該視圖控制器中的Done按鈕之后掩完,圖片和圖片描述將會被存儲。