美文网首页
CoreData存储

CoreData存储

作者: gale_小米 | 来源:发表于2021-12-23 09:10 被阅读0次

1.CoreData存储

测试中遇到的error

Multiple commands produce 
'/UITestDemo2.build/Debug-iphoneos/UITestDemo2.build/Objects-normal/arm64/Student2+CoreDataClass.o':
1) Target 'UITestDemo2' (project 'UITestDemo2') has compile command for Swift source files

新版本的Xcode 里面不在需要再创建 NsManagerObject subclass,移除掉对应的文件就可以

代码创建

import Foundation
import CoreData
/**
 * 代码创建 CoreDataStack
 */
class CoreDataStack : NSObject
{
    let contex : NSManagedObjectContext
    
    let coordinator : NSPersistentStoreCoordinator
    
    let model : NSManagedObjectModel
    
    let store : NSPersistentStore?
    
    private static let defult = CoreDataStack()
    
    static func defultStack() -> CoreDataStack {
        return defult
    }
    
    
    private override init() {
        //构建模型
        let bundle = Bundle.main
        let modelUrl : URL = bundle.url(forResource: "UITestDemo2", withExtension: "momd")!
        self.model = NSManagedObjectModel(contentsOf: modelUrl)!
        //持久化存储助理
        self.coordinator = NSPersistentStoreCoordinator(managedObjectModel: model)
        //获取上下文
        self.contex = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.mainQueueConcurrencyType)
        self.contex.persistentStoreCoordinator = self.coordinator
        //持久化存储
        let manager = FileManager.default
        let urls = manager.urls(for: FileManager.SearchPathDirectory.documentDirectory, in: FileManager.SearchPathDomainMask.userDomainMask)
        let documentUrl : URL = urls.first!
        let storeUrl = documentUrl.appendingPathComponent("UITestDemo2")
        if #available(iOS 15.0, *) {
            self.store = try! (self.coordinator.addPersistentStore(type: NSPersistentStore.StoreType.sqlite, configuration: nil, at: storeUrl, options: nil))
        } else {
            // Fallback on earlier versions
            print(" Fallback on earlier versions ")
            self.store = ( try!  self.coordinator.addPersistentStore(ofType: NSSQLiteStoreType.description, configurationName: nil, at: storeUrl, options: nil))
        }
        
    }
    
    func saveContext(){
        if self.contex.hasChanges {
            do{
                try self.contex.save()
            }catch{
                print(" Saved failed... ")
            }
        }
    }
}

demo 案例

/**
     * 插入数据
     */
    func installStudent3s(){
        let str1 = ["a" ,"b","c" ,"d","e" ,"f","g" ,"h" ,"i" ,"j"]
        let str2 = ["01","02","03","04","05","06","07","08","09","10"]
        for i in 0..<100 {
            let sno = "\(1000+i)"
            let name = str1[ i / 10 ] + str2 [i % 10]
            let score = i
            self.installStudent(sno: sno, name: name, score: Int32(score))
        }
        CoreDataStack.defultStack().saveContext()
        
    }
    
    func installStudent(sno:String , name:String ,score : Int32){
        let context = CoreDataStack.defultStack().contex
        let student = NSEntityDescription.insertNewObject(forEntityName: "Student2", into: context) as! Student2
        student.sno = sno
        student.name = name
        student.score = score
    }
    /**
     * 查询数据
     */
    func fetchRequestStudent3(){
        let context = CoreDataStack.defultStack().contex
        let request = NSFetchRequest<Student2>(entityName: "Student2")
        
        let sort = NSSortDescriptor(key: "sno", ascending: true, selector: #selector(NSString.localizedStandardCompare(_:)))
        request.sortDescriptors = [sort]
        //查询条件
        //request.predicate = NSPredicate(format: "score >70 ")
        //request.predicate = NSPredicate(format: " name like 'a*'")
        do{
            let students = try context.fetch(request)
            for student in students {
                print("sno=\(student.sno!.description) name=\(student.name!.description) socre=\(student.score.description)")
            }
        }catch{
            print("---fetch failed---")
        }
    }
    
    /**
     * 统计数据
     */
    func countStudents(){
        let context = CoreDataStack.defultStack().contex
        
        let request = NSFetchRequest<Student2>(entityName: "Student2")
        
        request.predicate = NSPredicate(format: "score > 90")
        //统计计数
        request.resultType = .countResultType
        do{
            let entries = try context.count(for: request)
            let count = entries
            print("count = \(count)")
        }catch{
            print("fetch failed")
        }
    }
    
    
    
    func averageStudentScore(){
        let context = CoreDataStack.defultStack().contex
        let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Student2")
        //指定返回结果为字典
        request.resultType = .dictionaryResultType
        
        let description = NSExpressionDescription()
        description.name = "AverageScore"
        
        let args = [ NSExpression(forKeyPath: "score") ]
        /**
         * forFunction 的值
         * sum:  求和
         * count: 统计
         * min:   最小
         * max: 最大
         */
        description.expression = NSExpression(forFunction: "average:", arguments: args)
        description.expressionResultType = .floatAttributeType  //返回指定类型
        
        //将平均值的表达式request属性
        request.propertiesToFetch = [description]
        do{
            let enties = try context.fetch(request)
            let result = enties.first! as! NSDictionary
            let averageScore = result["AverageScore"]
            print(" averageScore = \(averageScore!) ")
        }catch{
            print("fetch failed")
        }
        
    }
    
    
    /**
     * 修改信息
     */
    func updateStudent(){
        let context = CoreDataStack.defultStack().contex
        
        let request = NSFetchRequest<Student2>(entityName: "Student2")
        
        request.predicate = NSPredicate(format: "name like 'a*'")
        
        do{
            let students = try context.fetch(request)
            for student in students {
                student.score = 1005
            }
        }catch{
            print("fetch failde")
        }
        CoreDataStack.defultStack().saveContext()
    }
    
    /**
     * 删除数据
     */
    func deleteStudent(){
        let context = CoreDataStack.defultStack().contex
        let request = NSFetchRequest<Student2>(entityName: "Student2")
        
        request.predicate = NSPredicate(format: "name like 'a*'")
        
        do{
            let students = try context.fetch(request)
            for student in students {
                context.delete(student)
            }
        }catch{
            print(" fetch failed  ")
        }
        CoreDataStack.defultStack().saveContext()
        
    }

相关文章

网友评论

      本文标题:CoreData存储

      本文链接:https://www.haomeiwen.com/subject/snhvfrtx.html