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. 地址