资讯专栏INFORMATION COLUMN

CoreData初次实践(一)

zhangrxiang / 1274人阅读

摘要:今天我们来通过创建一个小的来实践我们的的学习。打开添加为在属性版中修改类型,勾选打开添加为为选择选择并且选中和。添加一个新的现在你运行程序,点击就可以看到有新的数据在列表中显示。我们接下来就是要把我们添加的数据删除。

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

初始项目

更多关于CoreDate的基础知识

创建Core Data Stack

主要一下几个步骤:

NSManagedObjectModel

NSPresistentStore

NSPersistentStoreCoordinator

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

Show your code

import CoreData

class 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()中来添加一些数据

//创建一个 Entity
let 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 来试试吧。

完成的项目

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/16110.html

相关文章

  • 认识CoreData - 初识CoreData

    摘要:由于项目比较大,还要兼顾之前项目的迭代和其他项目,目前为止只写完第一阶段。所以正如这系列文章的名字一样认识,打算写这系列文章来认识一下。文章中如有疏漏或错误,还请各位及时提出,谢谢 该文章属于原创,转载请注明: http://www.jianshu.com/p/c0e12a897971 `这段时间公司一直比较忙,和组里小伙伴一起把公司项目按照之前逻辑重写了一下。由于项目比较大,还要...

    _ivan 评论0 收藏0
  • 认识CoreData - 初识CoreData

    摘要:由于项目比较大,还要兼顾之前项目的迭代和其他项目,目前为止只写完第一阶段。所以正如这系列文章的名字一样认识,打算写这系列文章来认识一下。文章中如有疏漏或错误,还请各位及时提出,谢谢 该文章属于原创,转载请注明: http://www.jianshu.com/p/c0e12a897971 `这段时间公司一直比较忙,和组里小伙伴一起把公司项目按照之前逻辑重写了一下。由于项目比较大,还要...

    figofuture 评论0 收藏0
  • CoreData整理(四)——数据迁移和其他问题

    摘要:整理四数据迁移和其他问题目录轻量级数据迁移后续遇到的问题轻量级数据迁移在做版本的迭代过程中,难免会遇到要修改文件,比如新增或删除一个实体增加或删除一个原有实体的属性等。 CoreData整理(四)——数据迁移和其他问题 目录 轻量级数据迁移 后续遇到的问题 轻量级数据迁移 在做app版本的迭代过程中,难免会遇到要修改.xcdatamodeld文件,比如新增或删除一个实体、增加或...

    Nekron 评论0 收藏0
  • CoreData整理(四)——数据迁移和其他问题

    摘要:整理四数据迁移和其他问题目录轻量级数据迁移后续遇到的问题轻量级数据迁移在做版本的迭代过程中,难免会遇到要修改文件,比如新增或删除一个实体增加或删除一个原有实体的属性等。 CoreData整理(四)——数据迁移和其他问题 目录 轻量级数据迁移 后续遇到的问题 轻量级数据迁移 在做app版本的迭代过程中,难免会遇到要修改.xcdatamodeld文件,比如新增或删除一个实体、增加或...

    snowell 评论0 收藏0
  • 对比iOS中的四种数据存储

    摘要:把内存数据转移到闪存中进行持久化的操作称成为归档。应用加载远程数据生成应用数据对象的同时,通过把数据缓存起来,再次请求则直接通过获取数据。每一次有新的缓存对象存入,自动检测空间中过期的集合并清除。 你是用什么方法来持久保存数据的?这是在几乎每一次关于iOS技术的交流或讨论都会被提到的问题,而且大家对这个问题的热情持续高涨。本文主要从概念上把数据存储这个问题进行剖析,并且结合各自特点和适...

    szysky 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<