CoreData只是iOS數據持久化的其中一個方法,所有數據持久化如下
1、plist文件(屬性列表),通常用於儲存用戶設置,也zhi可以用於存儲捆綁的信息;
2、preference(偏好設置),常用於保存少量數據;
3、NSKeyedArchiver(歸檔),將內存中的對象實例保存成binary到磁盤並且可以逆向這個過程用來保存用戶操作狀態等;
4、SQLite 3,使用數據庫進行存儲;
5、CoreData,它提供了對象-關系映射(ORM)的功能,即能夠將OC對象轉化成數據,保存在SQLite數據庫文件中,也能夠將保存在數據庫中的數據還原成OC對象。
在新建項目時,把Use Core Data勾上
如果你創建時沒勾,可以參考別人的博客,自己手動添加
由於我勾選了Use Core Data,系統幫我生成了后綴為【xcdatamodeld】的檔案
單擊進入后,先創建實體(添加實體),然后添加屬性,最后為屬性設置需要存儲的類型(Type)
這里我為此實體(MyTest),添加唯一的屬性testSaveInt,類型為Int(Integer 16)
我這里只添加唯一屬性,這里額外推薦一篇很棒的博客,除了多屬性,里面還有提到屬性關聯,這個屬性被刪了,會影響到別的東西
具體在他寫的【四、邏輯與建模】,仔細看完他列舉的情景,就明白我在說什么了,不過他是用objective-c寫的,有點遺憾
接着創建一個NSManagedObject子類(點擊Editor -> Create NSmanagedObject Subclass...)
然后先選擇自己的項目(當初開始寫app時,創建的項目名稱)
最后再勾選剛剛創建的實體"MyTest"
創建完后,多出兩個檔案,分別是
MyTest+CoreDataClass.swift
MyTest+CoreDataProperties.swift(這個不用修改,它的作用是存放你剛剛添加的屬性,例如前面的testSaveInt)
我們在【MyTest+CoreDataClass.swift】添加自己封裝的方法,后續可以通過類的對象,來訪問此類的一些函數
以下的代碼,是對 Int 類型的變量 testSaveInt,做增刪改查的動作,具體流程如下
1、使用【增】的方法,寫入數據12
2、使用【查】的方法,查詢資料庫是否有數據(for循環檢驗:有無用MyTest這個實體創建的資料庫?)
3、使用【改】的方法,找出實體"MyTest"里,數據為12的Int,更改為38
4、使用【查】的方法,查詢數據是否被改變(假設第2步是成功的)
5、使用【刪】的方法,資料庫內,發現testSaveInt == 38 的,立刻刪除
6、使用【查】的方法,看看資料庫內,是否都不存在數據了
import UIKit // 把這行加上
import Foundation
import CoreData
@objc(MyTest)
public class MyTest: NSManagedObject {
// 獲取context
func getContext() -> NSManagedObjectContext {
let mDelegate = UIApplication.shared.delegate as! AppDelegate
return mDelegate.persistentContainer.viewContext
}
// MARK: - 【增】的功能
func coreDataAdd(command: String) {
switch command {
case "測試寫入":
let mDelegate = UIApplication.shared.delegate as! AppDelegate
let mContext = mDelegate.persistentContainer.viewContext
let newTest = NSEntityDescription.insertNewObject(forEntityName: "MyTest", into: mContext)as! MyTest
newTest.testSaveInt = 12
mDelegate.saveContext()
default:
break
}
}
// MARK: - 【刪】的功能
func coreDataDelete(command: String) {
switch command {
case "測試刪除":
// 獲取上下文
let mDelegate = UIApplication.shared.delegate as! AppDelegate
let mContext = mDelegate.persistentContainer.viewContext
// 設置查詢的實體,此處的實體是MyTest
let entity = NSEntityDescription.entity(forEntityName: "MyTest", in: mContext)
// 請求實體(Fetch:取、拿來)
let request = NSFetchRequest<MyTest>()
request.entity = entity
do {
let results:[AnyObject]? = try mContext.fetch(request)
for myTest in results as![MyTest] {
if myTest.testSaveInt == 38 {
mContext.delete(myTest)
mDelegate.saveContext()
}
}
} catch {
print("刪除數據失敗")
}
default:
break
}
}
// MARK: - 【改】的功能
func coreDataUpdate(command: String) {
switch command {
case "測試修改":
// 獲取上下文
let mDelegate = UIApplication.shared.delegate as! AppDelegate
let mContext = mDelegate.persistentContainer.viewContext
// 設置查詢的實體,此處的實體是MyTest
let entity = NSEntityDescription.entity(forEntityName: "MyTest", in: mContext)
// 請求實體(Fetch:取、拿來)
let request = NSFetchRequest<MyTest>()
request.entity = entity
do {
let results:[AnyObject]? = try mContext.fetch(request)
for myTest in results as![MyTest] {
if myTest.testSaveInt == 12 {
myTest.testSaveInt = 38
mDelegate.saveContext()
}
}
} catch {
print("修改數據失敗")
}
default:
break
}
}
// MARK: - 【查】的功能
func coreDataSearch(command: String) {
switch command {
case "測試讀取":
// 獲取上下文
let mContext = getContext()
// 設置查詢的實體,此處的實體是MyTest
let entity = NSEntityDescription.entity(forEntityName: "MyTest", in: mContext)
// 請求實體(Fetch:取、拿來)
let request = NSFetchRequest<MyTest>()
request.entity = entity
do {
let results:[AnyObject]? = try mContext.fetch(request)
for myTest in results as![MyTest] {
print("value=\(myTest.testSaveInt)")
}
} catch {
print("讀取數據失敗")
}
default:
break
}
}
}
最終,在需要執行【數據持久化】的類,寫上常量的申請(類的對象)
let classCoreData: MyTest = MyTest()
然后就可以用以下代碼,愉快的調用了
classCoreData.coreDataAdd("測試寫入") classCoreData.coreDataDelete("測試刪除") classCoreData.coreDataUpdate("測試修改") classCoreData.coreDataSearch("測試讀取")