import UIKit
import CoreData
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
}
//MARK: - CoreData
extension ViewController{
//MARK: 獲取上下文對象
func getContext() -> NSManagedObjectContext{
let appDelegate = UIApplication.shared.delegate as! AppDelegate
return appDelegate.persistentContainer.viewContext
}
//MARK: 插入班級信息
func insertClasses(){
for i in 1...100{
let classNO = Int64(i)
let name = "rg"+"\(i)"
insertClass(classno:classNO,name:name)
}
}
func insertClass(classno:Int64,name:String) {
//獲取上下文對象
let context = getContext()
// //創建一個實例並賦值
// let classEntity = NSEntityDescription.insertNewObject(forEntityName: "Class", into: context) as! Class
//
// //Class對象賦值
// classEntity.classNo = classno
// classEntity.name = name
//通過指定實體名 得到對象實例
let Entity = NSEntityDescription.entity(forEntityName: "Class", in: context)
let classEntity = NSManagedObject(entity: Entity!, insertInto: context)
classEntity.setValue(classno, forKey: "classNo")
classEntity.setValue(name, forKey: "name")
do {
//保存實體對象
try context.save()
} catch {
let nserror = error as NSError
fatalError("錯誤:\(nserror),\(nserror.userInfo)")
}
}
//MARK: 查詢班級信息
func getClass(){
// 異步fetch
//獲取數據上下文對象
let context = getContext()
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Class")
// 異步請求由兩部分組成:普通的request和completion handler
// 返回結果在finalResult中
let asyncFetchRequest = NSAsynchronousFetchRequest(fetchRequest: fetchRequest) { (result : NSAsynchronousFetchResult!) in
//對返回的數據做處理。
let fetchObject = result.finalResult as! [Class]
for c in fetchObject{
print("\(c.classNo),\(c.name ?? "")")
}
}
// 執行異步請求調用execute
do {
try context.execute(asyncFetchRequest)
} catch {
print("error")
}
}
//MARK: 修改班級信息
func modifyClass() {
//獲取委托
let app = UIApplication.shared.delegate as! AppDelegate
//獲取數據上下文對象
let context = getContext()
//聲明數據的請求,聲明一個實體結構
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Class")
//查詢條件
fetchRequest.predicate = NSPredicate(format: "classNo = 2", "")
// 異步請求由兩部分組成:普通的request和completion handler
// 返回結果在finalResult中
let asyncFecthRequest = NSAsynchronousFetchRequest(fetchRequest: fetchRequest) { (result: NSAsynchronousFetchResult!) in
//對返回的數據做處理。
let fetchObject = result.finalResult! as! [Class]
for c in fetchObject{
c.name = "qazwertdfxcvg"
app.saveContext()
}
}
// 執行異步請求調用execute
do {
try context.execute(asyncFecthRequest)
} catch {
print("error")
}
}
//MARK: 刪除班級信息
func deleteClass() -> Void {
//獲取委托
let app = UIApplication.shared.delegate as! AppDelegate
//獲取數據上下文對象
let context = getContext()
//聲明數據的請求,聲明一個實體結構
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Class")
// 異步請求由兩部分組成:普通的request和completion handler
// 返回結果在finalResult中
let asyncFetchRequest = NSAsynchronousFetchRequest(fetchRequest: fetchRequest) { (result:NSAsynchronousFetchResult) in
//對返回的數據做處理。
let fetchObject = result.finalResult! as! [Class]
for c in fetchObject{
//所有刪除信息
context.delete(c)
}
app.saveContext()
}
// 執行異步請求調用execute
do {
try context.execute(asyncFetchRequest)
} catch {
print("error")
}
}
//MARK: 統計信息
func countClass() {
//獲取數據上下文對象
let context = getContext()
//聲明數據的請求,聲明一個實體結構
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Class")
//請求的描述,按classNo 從小到大排序
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "classNo", ascending: true)]
//請求的結果類型
// NSManagedObjectResultType:返回一個managed object(默認值)
// NSCountResultType:返回滿足fetch request的object數量
// NSDictionaryResultType:返回字典結果類型
// NSManagedObjectIDResultType:返回唯一的標示符而不是managed object
fetchRequest.resultType = .dictionaryResultType
// 創建NSExpressionDescription來請求進行平均值計算,取名為AverageNo,通過這個名字,從fetch請求返回的字典中找到平均值
let description = NSExpressionDescription()
description.name = "AverageNo"
//指定要進行平均值計算的字段名classNo並設置返回值類型
let args = [NSExpression(forKeyPath: "classNo")]
// forFunction參數有sum:求和 count:計算個數 min:最小值 max:最大值 average:平均值等等
description.expression = NSExpression(forFunction: "average:", arguments: args)
description.expressionResultType = .floatAttributeType
// 設置請求的propertiesToFetch屬性為description告訴fetchRequest,我們需要對數據進行求平均值
fetchRequest.propertiesToFetch = [description]
do {
let entries = try context.fetch(fetchRequest)
let result = entries.first! as! NSDictionary
let averageNo = result["AverageNo"]!
print("\(averageNo)")
} catch {
print("failed")
}
}
//MARK:批量更新
func batchUpdate()
{
let batchUpdate = NSBatchUpdateRequest(entityName: "Class")
//所要更新的屬性 和 更新的值
batchUpdate.propertiesToUpdate = ["name": 55555]
//被影響的Stores
batchUpdate.affectedStores = self.getContext().persistentStoreCoordinator!.persistentStores
//配置返回數據的類型
batchUpdate.resultType = .updatedObjectsCountResultType
//執行批量更新
do {
let batchResult = try getContext().execute(batchUpdate) as! NSBatchUpdateResult
//批量更新的結果,上面resultType類型指定為updatedObjectsCountResultType,所以result顯示的為 更新的個數
print("\(batchResult.result!)")
} catch {
print("error")
}
}
}