CoreData初次实践(一)

CoreData初次实践(一),第1张

概述今天我们来通过创建一个小的Demo来实践我们的CoreDate 的学习。参考书籍Core_Data_by_Tutorials 初始项目 更多关于CoreDate的基础知识 二 创建Core Data Stack 主要一下几个步骤: NSManagedObjectModel NSPresistentStore NSPersistentStoreCoordinator NSManagedObjectC

今天我们来通过创建一个小的Demo来实践我们的CoreDate 的学习。参考书籍Core_Data_by_Tutorials

初始项目

更多关于CoreDate的基础知识

创建Core Data Stack

主要一下几个步骤:

NSManagedobjectModel

nspresistentStore

NSPersistentStoreCoordinator

NSManagedobjectContext
在这里就不多说每一个都是什么了,可以参考上边给出的两篇博客

Show your code

import CoreDataclass CoreDadaStack {   /// model name   private let modelname = "Dog Walk"   /// document Directory URL   private lazy var applicationdocumentsDirectory: NSURL = {       let urls = NSfileManager.defaultManager().URLsForDirectory(.documentDirectory,inDomains: .UserDomainMask)       return urls[urls.count - 1]   }()      /// Managed Object Model   private lazy var managedobjectModel: NSManagedobjectModel = {       let modelURL = NSBundle.mainBundle().URLForResource(self.modelname,withExtension: "momd")       return NSManagedobjectModel(contentsOfURL: modelURL!)!   }()   /// Presistent Store Coordinator   private lazy var psc: NSPersistentStoreCoordinator = {       let coordinator = NSPersistentStoreCoordinator(managedobjectModel: self.managedobjectModel)       let url = self.applicationdocumentsDirectory.URLByAppendingPathComponent(self.modelname)       do {           let options = [NSMigratePersistentStoresautomaticallyOption:true]           try coordinator.addPersistentStoreWithType(NSsqliteStoreType,configuration: nil,URL: url,options: options)       }catch {           print("添加持久化存储区错误")       }       return coordinator   }()   /// Managed Object Context   lazy var context: NSManagedobjectContext = {       var managedobjectContext = NSManagedobjectContext(concurrencyType: .MainQueueConcurrencyType)       managedobjectContext.persistentStoreCoordinator = self.psc       return managedobjectContext   }()   /**    Save Context Data    */   func saveContext() {       if context.hasChanges {           do {               try context.save()           } catch let error as NSError {               print("错误 ❌ \(error.localizedDescription)")               abort()           }       }   }}

选择VIEwController.swift添加下边代码
import CoreData

添加属性:
var managedContext: NSManagedobjectContext!

然后打开AppDelegate.swift

import CoreData
添加属性:

lazy var coreDataStack = CoreDataStack()

application(_:dIDFinishLaunchingWithOptions:)添加下边代码

func application(application: UIApplication,dIDFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {        let navigationController = window?.rootVIEwController as! UINavigationController    let vIEwcontroller = navigationController.topVIEwController as! VIEwController    vIEwcontroller.managedContext = coreDataStack.context    return true  }

最后我们在 UIApplicationDelegate的两个方法中调用存储方法

func applicationWillTerminate(application: UIApplication) {        coreDataStack.saveContext()    }    func applicationDIDEnterBackground(application: UIApplication) {        coreDataStack.saveContext()    }
Modeling your data

打开Dog Walk

添加 Dog Entity,添加属性 name 类型为 String

添加 Walk Entity,添加属性 date 类型为 Date

接下来我们完成关系。

打开 Dog Entity,添加relationship name 为 walks Set the destination to Walk
在属性版中修改Type类型,To Many,勾选 Ordered

打开 Walk Entity,添加relationship name 为 dog relationship 为 Dog Set the destination as dog and the inverse as walks.

Adding managed object subclasses

command + n 选择 NSManagedobject Subclass 选择 Dog Walk model 并且选中 Dog 和 Walk entitIEs。 语言选择 Swift

我在生成的Walk.swiftDog.swift中都重写了父类的方法,为了在生成这两个类的时候有代码提示。

overrIDe init(entity: NSEntityDescription,insertIntoManagedobjectContext context: NSManagedobjectContext?) {        super.init(entity: entity,insertIntoManagedobjectContext: context)    }
A walk down persistence lane

如果你上边的步骤都已经完成了,那么我们就可以开始存储数据了。

首先在VIEwController.swift中添加一个属性 var currentDog: Dog! 然后我们在vIEwDIDLoad()中来添加一些数据

//创建一个 Entitylet dogEntity = NSEntityDescription.entityForname("Dog",inManagedobjectContext: managedContext)   let dogname = "FIDo"   //首先来检查在数据库中是否存在一个名为 FIDo  的狗过       let dogFetch = NSFetchRequest(entityname: "Dog")   dogFetch.predicate = nspredicate(format: "name == %@",dogname)   do{   //执行查询       let results = try managedContext.executeFetchRequest(dogFetch) as! [Dog]       //如果这个狗狗存在的话直接获取赋值给 currentDog       if results.count > 0 {           currentDog = results.first       }else {       //如果不存在 则实例化一个Dog           currentDog = Dog(entity: dogEntity!,insertIntoManagedobjectContext: managedContext)           currentDog.name = dogname           try managedContext.save()       }   }catch let error as NSError{       print("Error:\(error)" + "description:\(error.localizedDescription)")   }

接下来我们来实现点击添加按钮之后添加新狗狗散步时间的功能。

@IBAction func add(sender: AnyObject) {   //添加一个新的 Walk Entity into Core Data    let walkEntity = NSEntityDescription.entityForname("Walk",inManagedobjectContext: managedContext)   let walk = Walk(entity: walkEntity!,insertIntoManagedobjectContext: managedContext)   walk.date = NSDate.timeIntervalSinceReferenceDate()      //insert the new walk into the dog's walks set   let walks = currentDog.walks!.mutablecopy() as! NSMutableOrderedSet   walks.addobject(walk)   currentDog.walks = walks.copy() as? NSOrderedSet   //save the managed object context   do {       try managedContext.save()   }catch let error as NSError {       print("Could not save:\(error)")   }      tableVIEw.reloadData() }

现在你运行程序,点击➕就可以看到有新的数据在列表中显示。

Deleting objects from Core Data

我们接下来就是要把我们添加的数据删除。
我们来重写下边的方法

func tableVIEw(tableVIEw: UItableVIEw,commitEditingStyle editingStyle: UItableVIEwCellEditingStyle,forRowAtIndexPath indexPath: NSIndexPath) {        if editingStyle == .Delete {           //选择要删除的walk           let walkToRemove = currentDog.walks![indexPath.row] as! Walk           //删除           managedContext.deleteObject(walkToRemove)           do {               //保存 *** 作               try managedContext.save()           }catch let error as NSError {               print("Could not save: \(error)")           }           // 删除视图中的数据           tableVIEw.deleteRowsAtIndexPaths([indexPath],withRowAnimation: .automatic)       } }

运行你的app 来试试吧。

完成的项目

总结

以上是内存溢出为你收集整理的CoreData初次实践(一)全部内容,希望文章能够帮你解决CoreData初次实践(一)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1078969.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-27
下一篇2022-05-27

发表评论

登录后才能评论

评论列表(0条)

    保存