zoukankan      html  css  js  c++  java
  • coreData数据操作

    // 1. 建立模型文件
    // 2. 建立CoreDataStack
    // 3. 设置AppDelegate

    接着

    //
    //  CoreDataStack.swift
    //  CoreDataStackDemo
    //
    //  Created by wangbiao on 15/10/29.
    //  Copyright © 2015年 wangbiao. All rights reserved.
    //
    
    import CoreData
    
    class CoreDataStack: NSObject {
        // MARK: - Properties
        let context: NSManagedObjectContext
        let coordinator: NSPersistentStoreCoordinator
        let model: NSManagedObjectModel
        let store: NSPersistentStore?
        
        // MARK: - Singleton
        static func defaultStack() -> CoreDataStack {
            return instance
        }
        
        fileprivate static let instance = CoreDataStack()
        
        fileprivate override init() {
            // 构建托管对象模型
            let bundle = Bundle.main
            let modelURL = bundle.url(forResource: "Test", withExtension: "momd")!
            model = NSManagedObjectModel(contentsOf: modelURL)!
            
            // 构建持久化存储助理
            coordinator = NSPersistentStoreCoordinator(managedObjectModel: model)
            
            // 构建托管对象上下文,并且将助理连接到上下文
            context = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
            context.persistentStoreCoordinator = coordinator
            
            // 构建持久化存储
            let manager = FileManager.default
            let urls = manager.urls(for: .documentDirectory, in: .userDomainMask)
            let documentsURL = urls.first!
            let storeURL = documentsURL.appendingPathComponent("Test")
            
            store = (try! coordinator.addPersistentStore(ofType: NSSQLiteStoreType,
                configurationName: nil, at: storeURL, options: nil))
        }
        
        // MARK: - Function
        func saveContext () {
            if context.hasChanges {
                do {
                    try context.save()
                } catch {
                    print("Save failed...")
                }
            }
        }
    }


    接着实现数据操作

    //新增数据
    func insertStudent(sno: String, name: String, score: Int) {
            // 获取上下文(也就是从”coreData基础“里面的那个类里面获取)
            let context = CoreDataStack.defaultStack().context
            
            // 构建实体对象
            let student = NSEntityDescription.insertNewObject(forEntityName: "Student",
                into: context) as! Student
            
            // 设置相关属性
            student.sno = sno
            student.name = name
            student.score = score as NSNumber?
        }
    
    // 查询数据
        func fetchStudents() {
            // 获取上下文
            let context = CoreDataStack.defaultStack().context
            
            // 构建抓取请求
            let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Student")
            
            // 指定按照学号(sno)升序排列
            let sort = NSSortDescriptor(key: "sno", ascending: true,
                selector: #selector(NSString.localizedStandardCompare(_:)))
            request.sortDescriptors = [sort]
            
            // 构建查询条件
    //        request.predicate = NSPredicate(format: "score > 60")
    //        request.predicate = NSPredicate(format: "name like 'a*'")
            
            do {
                let students = (try context.fetch(request)) as! [Student]
                for student in students {
                    print("(student.sno!), (student.name!), (student.score!)")
                }
            } catch {
                print("Fetch failed...")
            }
        }
    
    // 统计信息
        func countStudents() {
    //        // 1. 统计分数大于90的人数
    //        
    //        // 获取上下文
    //        let context = CoreDataStack.defaultStack().context
    //        
    //        // 构建抓取请求
    //        let request = NSFetchRequest(entityName: "Student")
    //        request.predicate = NSPredicate(format: "score > 90")
    //        request.resultType = .CountResultType
    //        
    //        do {
    //            let entries = (try context.executeFetchRequest(request))
    //            let count = entries.first!.integerValue
    //            print("Count: (count)")
    //        } catch {
    //            print("Fetch failed...")
    //        }
            
            
            // 2. 计算平均分数
            
            // 获取上下文
            let context = CoreDataStack.defaultStack().context
            
            // 构建抓取请求
            let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Student")
            request.resultType = .dictionaryResultType // 指定返回结果为字典
            
            // 构建表达式
            let description = NSExpressionDescription()
            description.name = "AverageScore"
            let args = [NSExpression(forKeyPath: "score")]
            description.expression = NSExpression(forFunction: "average:", arguments: args)
            description.expressionResultType = .floatAttributeType // 指定返回值类型
            
            // 将求平均值的表达式设置给request的属性
            request.propertiesToFetch = [description]
            
            do {
                let entries = (try context.fetch(request))
                let result = entries.first! as! NSDictionary
                let averageScore = result["AverageScore"]!
                print("Average: (averageScore)")
            } catch {
                print("Fetch failed...")
            }
        }
    
    // 修改数据
        func updateStudents() {
            // 获取上下文
            let context = CoreDataStack.defaultStack().context
            
            // 构建抓取请求
            let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Student")
            request.predicate = NSPredicate(format: "name like 'a*'")
            
            do {
                let students = (try context.fetch(request)) as! [Student]
                for student in students {
                    student.score = 100
                }
            } catch {
                print("Fetch failed...")
            }
            
            // 保存
            CoreDataStack.defaultStack().saveContext()
            
            // 备注: 批量更新 & 异步操作 ???
        }
        
        // 删除数据
        func deleteStudents() {
            // 获取上下文
            let context = CoreDataStack.defaultStack().context
            
            // 构建抓取请求
            let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Student")
            request.predicate = NSPredicate(format: "score < 60")
            
            do {
                let students = (try context.fetch(request)) as! [Student]
                for student in students {
                    context.delete(student)
                }
            } catch {
                print("Fetch failed...")
            }
            
            // 保存
            CoreDataStack.defaultStack().saveContext()
        }
    总结:
    增:
    1:获取上下文
    如:let context = CoreDataStack.defaultStack().context
    2:构建实体对象
    如:let student = NSEntityDescription.insertNewObject(forEntityName: "Student",
    into: context) as! Student
    3:设置相关属性
    如: student.sno = sno
    4:保存数据
    如:CoreDataStack.defaultStack().saveContext()
     
    修改,删除
    1:获取上下文
    2:构建抓取请求
    如:let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Student")
    3:给抓去请求设置相关属性吧
    如:
    //相当于给它设置约束
    request.predicate = NSPredicate(format: "name like 'a*'")
    // 指定返回结果为字典(修改,删除一般不用设置这个)
    request.resultType = .dictionaryResultType
    4:执行抓取操作
    do {
    let students = (try context.fetch(request)) as! [Student]
    for student in students {
    //修改如:student.score = 100
    //删除如:context.delete(student)
    }
    } catch {
    print("Fetch failed...")
    }
    5:保存数据
     
    查询
    1:获取上下文
    2:构建抓取请求
    3:指定按照学号(sno)升序排列(其实此部可以省略)
    let sort = NSSortDescriptor(key: "sno", ascending: true,
    selector: #selector(NSString.localizedStandardCompare(_:)))
    request.sortDescriptors = [sort]
    4:执行抓取语句
    do {
    let students = (try context.fetch(request)) as! [Student]
    for student in students {
    print("(student.sno!), (student.name!), (student.score!)")
    }
    } catch {
    print("Fetch failed...")
    }
    5:释放资源
     
    统计
    1:获取上下文
    2:构建抓取请求
    3:指定按照学号(sno)升序排列(其实此部可以省略)
    let sort = NSSortDescriptor(key: "sno", ascending: true,
    selector: #selector(NSString.localizedStandardCompare(_:)))
    request.sortDescriptors = [sort]
    4: 构建表达式(average是聚合函数,当然还有其他的)
    如:let description = NSExpressionDescription()
    description.name = "AverageScore"
    let args = [NSExpression(forKeyPath: "score")]
    description.expression = NSExpression(forFunction: "average:", arguments: args)
    description.expressionResultType = .floatAttributeType // 指定返回值类型
    5:将求平均值的表达式设置给request的属性
    如request.propertiesToFetch = [description]
    4:执行抓取语句
    do {
    let entries = (try context.fetch(request))
    let result = entries.first! as! NSDictionary
    let averageScore = result["AverageScore"]!
    print("Average: (averageScore)")
    } catch {
    print("Fetch failed...")
    }
    5:释放资源
     
    当然,这个只是一个例子而已,不是所有的统计例子都要那么复杂的
    如下面这个例子
    // 1. 统计分数大于90的人数
    //
    // // 获取上下文
    // let context = CoreDataStack.defaultStack().context
    //
    // // 构建抓取请求
    // let request = NSFetchRequest(entityName: "Student")
    // request.predicate = NSPredicate(format: "score > 90")
    // request.resultType = .CountResultType
    //
    // do {
    // let entries = (try context.executeFetchRequest(request))
    // let count = entries.first!.integerValue
    // print("Count: (count)")
    // } catch {
    // print("Fetch failed...")
    // }
  • 相关阅读:
    Unity3D串口处理
    Crixalis's Equipment 杭电 (设计贪心算法,比较巧妙,我用的是结构体排序)
    杭电 看归并排序和快速排序
    杭电acm 排名 (涉及到结构体排序)
    程序在计算机的内存(看到了一篇博客,解决了我的疑惑)
    贪心算法and排序 杭电一题的启发
    辗转相除法 杭电acm
    单调队列
    用栈的思想处理字符串倒置问题更清晰
    VS的哪些事儿之二
  • 原文地址:https://www.cnblogs.com/LarryBlogger/p/6186655.html
Copyright © 2011-2022 走看看