我简单的研究下Swift的CoreData,感觉和Object-C差不多,CoreData并不可怕,我总结了下只需要三步
一、CoreData 数据表创建
1、File->New->File->Data Model-> Next (起名为CoreData,注意很重要,和代码里的名称要一至)
2、添加表数据(看图:Add Entity-表名大写 Attribute-添加字段)
3、生成Model
Language->Swift
最后生成 Editor-> Create NSManagedObject SubClass
二、CoreData 管理文件
对于使用我没有放在appdelegate里,而是封装了一个管理类,这样看上去很容易管理、简洁
import Foundation
import CoreData
/// 被管理的数据上下文 初始化的后,必须设置持久化存储助理
var managedObjectContext: NSManagedObjectContext = {
let coordinator = persistentStoreCoordinator
var managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
managedObjectContext.persistentStoreCoordinator = coordinator
return managedObjectContext
}()
/// 持久化存储助理 初始化必须依赖NSManagedObjectModel,之后要指定持久化存储的数据类型,默认的是NSSQLiteStoreType,即SQLite数据库;并指定存储路径为Documents目录下,以及数据库名称
var persistentStoreCoordinator: NSPersistentStoreCoordinator = {
let coordinator = NSPersistentStoreCoordinator(managedObjectModel: managedObjectModel)
let url = applicationDocumentsDirectory.appendingPathComponent("CoreData.sqlite")
var failureReason = "There was an error creating or loading the application's saved data."
do {
try coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: nil)
} catch {
var dict = [String: AnyObject]()
dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data" as AnyObject?
dict[NSLocalizedFailureReasonErrorKey] = failureReason as AnyObject?
dict[NSUnderlyingErrorKey] = error as NSError
let wrappedError = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict)
NSLog("Unresolved error \(wrappedError), \(wrappedError.userInfo)")
abort()
}
return coordinator
}()
/// Documents目录路径
var applicationDocumentsDirectory: NSURL = {
let urls = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
return urls[urls.count-1] as NSURL
}()
/// 被管理的数据模型 初始化必须依赖.momd文件路径,而.momd文件由.xcdatamodeld文件编译而来
var managedObjectModel: NSManagedObjectModel = {
print(Bundle.main)//CoreData
let modelURL = Bundle.main.url(forResource: "CoreData", withExtension: "momd")!
return NSManagedObjectModel(contentsOf: modelURL)!
}()
/// 保存数据到持久层
func saveContext () {
if managedObjectContext.hasChanges {
do {
try managedObjectContext.save()
} catch {
let nserror = error as NSError
NSLog("Unresolved error \(nserror), \(nserror.userInfo)")
abort()
}
}
}
三、使用增删改查
/// 增加数据
func addData(){
/*
增加数据
*/
/// 生成一个模型类似model
let contactIonfo = NSEntityDescription.insertNewObject(forEntityName: "Preson", into: managedObjectContext) as! Preson
//两种赋值方式 如果你创建了Preson 的NSManagedObjectModel
//那就可以用点语法调出属性否则只能用setValue赋值
//点语法赋值
contactIonfo.age = 12
contactIonfo.name = "wangmumu"
//setValue赋值
//contactIonfo .setValue("1", forKey: "name")
//contactIonfo .setValue(11, forKey: "age")
/// 保存到本地
saveContext()
}
/// 查询数据
func queryData(){
///查询数据
/// 返回一个查询对象
let fetchRequest = NSFetchRequest.init()
/// 生成一个要查询的表的对象
let entity = NSEntityDescription.entity(forEntityName: "Preson", in: managedObjectContext)
/// 查询对象属性
fetchRequest.entity = entity
/// 判断查询对象是否为空 防止崩溃
if (entity != nil) {
/// 查询结果
do{
/// 成功
let qwqwrr:[AnyObject]? = try managedObjectContext.fetch(fetchRequest)
for info:NSManagedObject in qwqwrr as![NSManagedObject] {
print(info)
}
}catch{
/// 失败
fatalError("查询失败:\(error)")
}
}else{
/// 查询对象不存在
print("查询失败:查询不存在")
}
}
/// 修改数据
func changeData(){
///修改数据
///先查询到要修改内容然后在修改数据
/// 返回一个查询对象
let fetchRequest = NSFetchRequest.init()
/// 生成一个要查询的表的对象
let entity = NSEntityDescription.entity(forEntityName: "Preson", in: managedObjectContext)
/// 查询对象属性
fetchRequest.entity = entity
/// 判断查询对象是否为空 防止崩溃
if (entity != nil) {
/// 查询结果
do{
/// 成功
///两种方法 0有Preson对象时和1没有的时候
let temp:[AnyObject] = try managedObjectContext.fetch(fetchRequest)
//1没有对象时
#if false
for info:NSManagedObject in temp as![NSManagedObject] {
info.setValue("wmm", forKey: "name")
}
#else
//0有对象时
for info:Preson in temp as![Preson] {
info.name = "wmm"
}
#endif
}catch{
/// 失败
fatalError("修改失败:\(error)")
}
}else{
/// 查询对象不存在
print("查询失败:查询不存在")
}
}
/// 删除数据
func deleteData(){
///删除数据
///先查询到要修改的内容然后删除
/// 返回一个查询对象
let fetchRequest = NSFetchRequest.init()
/// 生成一个要查询的表的对象
let entity = NSEntityDescription.entity(forEntityName: "Preson", in: managedObjectContext)
/// 查询对象属性
fetchRequest.entity = entity
/// 判断查询对象是否为空 防止崩溃
if (entity != nil) {
/// 查询结果
do{
/// 成功
///两种方法 0有Preson对象时和1没有的时候
let temp:[AnyObject] = try managedObjectContext.fetch(fetchRequest)
for info:Preson in temp as![Preson] {
if info.name == "wmm" {
//删除对象
managedObjectContext.delete(info)
}
}
}catch{
/// 失败
fatalError("删除失败:\(error)")
}
}else{
/// 查询对象不存在
print("查询失败:查询不存在")
}
///删除成功后再次保存到本地
saveContext()
}