1. 新建数据库
1.1 在新项目中
创建时勾选 Use Core Data即可,XCode会帮我们创建一个,
且在AppDelegate文件中生成获取context方法和保存的方法
2.1 在旧项目中
New File -> Core Data -> Core Model
2. 新建表
选中数据库文件xx.xcdatamodelId
点击左下角的AddEntity, 在左上角中出现Default的表,更改为自己想要的名字即可
Attributes 中可以添加属性名和属性类型
Relationships 中可以添加关系(给第一个表添加关系时 Inverse的选项只有‘Inverse’,需要给第二个关联表也加上关系),在右栏Data Inspectable的Type中选择(To One’ or ‘To Many’ )
4. 升级数据库
选中数据库文件xx.xcdatamodelId
点击菜单Editor -> Add Model Version... -> 写入数据的名字
在右栏Fiel Inspectable的Core Data Model -> Model Version -> Current 中选中新的数据库名即可
5. 增删改查
class GLCoreDataManager: NSObject { static let shared: GLCoreDataManager = GLCoreDataManager() //xcdatamodel 的name public var dbName: String = "Model" // MARK: - Core Data stack lazy var persistentContainer: NSPersistentContainer = { /* The persistent container for the application. This implementation creates and returns a container, having loaded the store for the application to it. This property is optional since there are legitimate error conditions that could cause the creation of the store to fail. */ let container = NSPersistentContainer(name: self.dbName) container.loadPersistentStores(completionHandler: { (storeDescription, error) in if let error = error as NSError? { // Replace this implementation with code to handle the error appropriately. // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. /* Typical reasons for an error here include: * The parent directory does not exist, cannot be created, or disallows writing. * The persistent store is not accessible, due to permissions or data protection when the device is locked. * The device is out of space. * The store could not be migrated to the current model version. Check the error message to determine what the actual problem was. */ fatalError("Unresolved error (error), (error.userInfo)") } }) return container }() // MARK: - Core Data Saving support ///保存修改的内容 func saveContext () { let context = persistentContainer.viewContext if context.hasChanges { do { try context.save() } catch { // Replace this implementation with code to handle the error appropriately. // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. let nserror = error as NSError fatalError("Unresolved error (nserror), (nserror.userInfo)") } } } /// 添加一条实体数据 /// - Parameters: /// - entityName: 实体名称 /// - completion: 在闭包中做属性的填充 func addData(with entityName: String, completion: (NSManagedObject)->Void) { let context = self.persistentContainer.viewContext let model = NSEntityDescription.insertNewObject(forEntityName: entityName, into: context) completion(model) saveContext() } /// 创建一条实体数据 /// - Parameter entityName: 实体名称 /// - Returns: NSManagedObject实例 func createData(with entityName: String) -> NSManagedObject { let context = self.persistentContainer.viewContext let model = NSEntityDescription.insertNewObject(forEntityName: entityName, into: context) return model } /// 根据条件删除相应的实体数据 /// - Parameters: /// - entityName: 实体名称 /// - predicate: 谓词正则(String) func deleteData(with entityName: String, predicate: String) { let predicate2 = NSPredicate(format: predicate, "") deleteData(with: entityName, predicate: predicate2) addData(with: "") { ent in } } /// 根据条件删除相应的实体数据 /// - Parameters: /// - entityName: 实体名称 /// - predicate: 谓词正则(NSPredicate) func deleteData(with entityName: String, predicate: NSPredicate? = nil) { let context = self.persistentContainer.viewContext let m = self.fetchData(with: entityName, limit: Int.max, offset: 0, predicate: predicate) as? [NSManagedObject] guard let array = m else { return } for info in array { context.delete(info) } saveContext() } /// 获取相应条件下的所有数据列表 /// - Parameters: /// - entityName: 实体名称 /// - limit: 每页的大小 /// - offset: 页码的偏移量 /// - predicate: 谓词正则(String) /// - Returns: 模型列表 func fetchData(with entityName: String, limit: Int = 20, offset: Int = 0, predicate: String) -> [Any]?{ let predicate2 = NSPredicate(format: predicate, "") return self.fetchData(with: entityName, limit: limit, offset: offset, predicate: predicate2) } /// 获取相应条件下的所有数据列表 /// - Parameters: /// - entityName: 实体名称 /// - limit: 每页的大小 /// - offset: 页码的偏移量 /// - predicate: 谓词正则(NSPredicate) /// - Returns: 模型列表 func fetchData(with entityName: String, limit: Int = 20, offset: Int = 0, predicate: NSPredicate? = nil) -> [Any]? { let context = self.persistentContainer.viewContext let request = NSFetchRequest<NSFetchRequestResult>(entityName: entityName) request.fetchOffset = offset request.fetchLimit = limit if let p = predicate { request.predicate = p } do { let fetchObjects = try context.fetch(request) return fetchObjects } catch { return nil } } /// 获取相应条件下的第一条数据列表 /// - Parameters: /// - entityName: 实体名称 /// - predicate: 谓词正则(NSPredicate) /// - Returns: 第一条数据对象 func fetchOne(with entityName: String, predicate: NSPredicate? = nil) -> Any? { return self.fetchData(with: entityName, limit: 1, offset: 0, predicate: predicate)?.first } /// 获取相应条件下的第一条数据列表 /// - Parameters: /// - entityName: 实体名称 /// - predicate: 谓词正则(String) /// - Returns: 第一条数据对象 func fetchOne(with entityName: String, predicate: String) -> Any? { return self.fetchData(with: entityName, limit: 1, offset: 0, predicate: predicate)?.first } /// 修改数据 /// - Parameters: /// - entityName: 实体名称 /// - predicate: 谓词正则(NSPredicate) /// - completion: 在闭包中做相应的修改 func modifyData(with entityName: String, predicate: NSPredicate? = nil, completion: (NSManagedObject)->Void) { let m = self.fetchData(with: entityName, limit: Int.max, offset: 0, predicate: predicate) as? [NSManagedObject] guard let array = m else { return } for info in array { completion(info) } saveContext() } /// 修改数据 /// - Parameters: /// - entityName: 实体名称 /// - predicate: 谓词正则(String) /// - completion: 在闭包中做相应的修改 func modifyData(with entityName: String, predicate: String, completion: (NSManagedObject)->Void) { let predicate2 = NSPredicate(format: predicate, "") modifyData(with: entityName, predicate: predicate2, completion: completion) } }
6. 地址