CoreData是iOS提供的存储服务,可以将数据持久化到SQLlite文件中。

通常需要:

  1. 一个.xcdatamodeld文件, 里面可以创建Entity(数据库表)和Attribute(表字段)。
    • 注意需要将Class的Codegen设置为Manual/None,否则可能会出现编译错误。
  2. 自动生成CoreData Properties和Class文件。
  3. 获取CoreData的上下文:
    func getContext(modelFileName: String, sqliteFileName: String) -> NSManagedObjectContext? {
        var context: NSManagedObjectContext?
    	// xcdatamodeld文件名
        let modelUrl = Bundle.main.url(forResource: modelFileName, withExtension: "momd")
        if let modelUrl = modelUrl {
            let modelManager = NSManagedObjectModel(contentsOf: modelUrl)
            if let modelManager = modelManager {
                let store = NSPersistentStoreCoordinator(managedObjectModel: modelManager)
                let path = URL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first! + "/" + sqliteFileName + ".sqlite")
                print(path)
                try! store.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: path, options: nil)
                context = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
                context?.persistentStoreCoordinator = store
            }
        }
        return context
    }
    
  4. 利用context进行数据的增删改查:
    // 注意此处的查询最好使用block回调的方式,否则单纯使用NSAsynchronousFetchResult,由于是异步的,可能返回nil
    func query(context: NSManagedObjectContext, condition: String, success: @escaping ([SchoolClass]) -> Void) {
        let request = NSFetchRequest<SchoolClass>(entityName: entityName)
        request.predicate = NSPredicate(format: condition)
        let asyncFetch = NSAsynchronousFetchRequest(fetchRequest: request) { (result: NSAsynchronousFetchResult<SchoolClass>) in
            success(result.finalResult ?? [])
        }
        try! context.execute(asyncFetch)
    }
    
    func insertData(context: NSManagedObjectContext) -> SchoolClass {
        let entity: SchoolClass = NSEntityDescription.insertNewObject(forEntityName: entityName, into: context) as! SchoolClass
        entity.name = "三年二班\(arc4random() % 20)"
        entity.studentCount = Int16((arc4random() % 100))
        return entity
    }
    

标签: Core Data, 持久化, SQLite

添加新评论

0%