CoreData是iOS提供的存储服务,可以将数据持久化到SQLlite文件中。
通常需要:
- 一个
.xcdatamodeld
文件, 里面可以创建Entity(数据库表)和Attribute(表字段)。- 注意需要将Class的Codegen设置为Manual/None,否则可能会出现编译错误。
- 自动生成CoreData Properties和Class文件。
- 获取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 }
- 利用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 }