Swift中使用Core Data (一)

CoreData是Mac、iPhone应用里标准的数据存储方法。所以,我们很有必要学习这个技术。那么我们要创建什么呢?首先是一个table view来处理数据,添加、删除、编辑,还有查找和排序。这些数据会被一直保存,即使是设备重启了都会存在。因为,这些数据时放在sqlite里的。

苹果的官方是这么描述Core Data的,“Core Data库是一个高层的自动的管理对象生命周期和持久话的解决方案”

下面,我们就一步一步的开始。首先创建一个Xcode6的项目,选择single-view-template,语言选择Swift,选择开启Core Data。这个项目就叫做MyLog

打开AppDelegate.swift,你会发现已经生成了很多的代码。这些都是初始化和设定Core Data的。使用Core Data,第一个需要了解的就是managedObjectContext,下面是定义:

lazy var managedObjectContext: NSManagedObjectContext? = {
    // Returns the managed object context for the application (which is already bound to the persistent store
    // coordinator for the application.) This property is optional since there are legitimate error
    // conditions that could cause the creation of the context to fail.
    let coordinator = self.persistentStoreCoordinator
    if coordinator == nil {
        return nil
    }
    var managedObjectContext = NSManagedObjectContext()
    managedObjectContext.persistentStoreCoordinator = coordinator
    return managedObjectContext
}()

"项目创建完成后,Xcode会自动添加CoreData库。自动在AppDelegate中添加NSManagedObjectContext、NSManagedObjectModel、NSPersistentCoordinator属性和saveContext、applicationDocumentDirectory两个方法。当然最不能少的就是创建xcdatamodeld文件。如果,你没有在项目开始的时候选择使用CoreData,那么可以手动添加这些内容。这样一样可以使用Core Data。"

For the most part, all you really need to know about this though, is that managedObjectContext is a lazily computed variable on AppDelegate. Knowing this we can find it from our ViewController.swift file. For example in viewDidLoad() of ViewController.swift, we can use this code to print the managedObjectContext’s description to the console.

First we need to set up a lazily loaded variable in the ViewController.swift file that can help us get the managedObjectContext from the app delegate using the UIApplication.sharedApplication().delegate property. Note that you’ll need to import CoreData in order to use the NSManagedObjectContext class name here.

import UIKit
import CoreData

class ViewController: UIViewController {

    lazy var managedObjectContext : NSManagedObjectContext? = {
        let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
        if let managedObjectContext = appDelegate.managedObjectContext {
            return managedObjectContext
        }
        else {
            return nil
        }
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        println(managedObjectContext!)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

The managedObjectContext variable is computed using the existing managedObjectContext in the application’s delegate. In viewdidLoad() we cause this variable to be computed by printing it to the console. If your application is set up right you should see something like this:

<NSManagedObjectContext: 0x7fff39c3b790>

You’ll notice the Xcode template produced an additional file, MyLog.xcdatamodeld.

Opening up this file you can see the Core Data model editor.

Let’s add a new Core Data entity called LogItem. Our log app will show a list of LogItems, which have a bit of text in them.

点击“Add Entity”按钮,在右侧面板中选择“Data Model Inspector”。这里,我们就可以重命名默认的EntityLogItem

然后,在下面右侧的地方点击“+Attribute”按钮添加属性。

把第一个属性命名为title,类型设定为String。然后再添加一个itemText属性,类型也是String。

这样,就创建了我们的第一个Entity。我们还需要在代码中直接使用这个类。Xcode提供了一个工具。在菜单中选择Editor->Create NSManagedObject SubClass...

在弹出框中选择MyLog的model文件,点Next。之后选择LogItem实体。在弹出的文件保存窗口中选择Swift语言。最后点创建按钮。这时,你会看到一个LogItem.swift文件已经出现在项目中。

import Foundation
import CoreData

class LogItem: NSManagedObject {
    @NSManaged var title: String
    @NSManaged var itemText: String
}

这个类是基于xcdatamodeld文件中的LogItem创建并代表了这个entity。这个类的property则代表了Entity的属性。@NSManaged则使得property可以操作Core Data的Entity。

最后还需要修改一个地方才能使用上面创建的类。在Inspector的Entity菜单的“Class”字段内给LogItem加上项目名称作为前缀,这里就是:MyLog.LogItem。

在ViewController.swift文件的viewDidLoad方法中,初始化几个LogItem。方法有很多,不过最好的办法是用NSEntityDescription的insertNewObjectForEntityForName方法。

override func viewDidLoad() {
    super.viewDidLoad()

    let newItem = NSEntityDescription.insertNewObjectForEntityForName("LogItem", inManagedObjectContext: self.managedObjectContext!) as LogItem
}

这里,我们使用系统默认生成的managedObjectContext在Core Data中插入了一个对象。这个方法返回一个NSManagedObject类型的对象。这个对象都会响应valueForKey方法。如果你不是很理解也没有关系,继续往下看。

在NSManagedObject的新对象newItem中,我们可以用newItem.valueForKey("title")的方法获得title值。不过这个可不是什么好方法,因为你不知道什么时候会拼错了property名、或者弄错了对象的类型等。

所以,在这里我们将NSManagedObject的类型转化为LogItem。这样就可以直接存取属性值了。如:

override func viewDidLoad() {
    super.viewDidLoad()

    let newItem = NSEntityDescription.insertNewObjectForEntityForName("LogItem", inManagedObjectContext: self.managedObjectContext!) as LogItem

    newItem.title = "Wrote Core Data Tutorial"
    newItem.itemText = "Wrote and post a tutorial on the basics of Core Data to blog."
    presentItemInfo()
}

如果我们之前没有声称LogItem.swift文件,那么类型LogItem就是为定义的。那就只能用valueForKey来存取NSManagedObject对象的属性值了。这样在调用Core Data API的时候就不得不在运行状态下用字符串比较的方法获得Entity、state等的类型,非常麻烦。

既然,我们创建了一个新对象,设置了title和text属性。我们就可以查找这个entity了。在viewDidLoad的最后调用presentItemInfo方法。这个方法点定义:

func presentItemInfo() {
    let fetchRequest = NSFetchRequest(entityName: "LogItem")
    if let fetchResults = managedObjectContext!.executeFetchRequest(fetchRequest, error: nil) as? [LogItem] {

        let alert = UIAlertView()
        alert.title = fetchResults[0].title
        alert.message = fetchResults[0].itemText
        alert.show()
    }
}

首先,我们创建一个NSFetchRequest实例,指定处理entityLogItem。之后,执行方法executeFetchRequest方法查找LogItem实例。因为我们只设定了查找的entity名称,所以持久话的LogItem都将被查找到并存放在实例fetchResults中。最后把LogItem的title和message放在UIAlertView中显示在屏幕上。

运行app你会看到屏幕上出现的结果。这还是一个很简单的app。

第二部分中,我们将会讨论处理使用NSPredicate处理多条记录请求的内容。

时间: 2024-10-16 16:43:55

Swift中使用Core Data (一)的相关文章

iOS开发过程中使用Core Data应避免的十个错误

原文出处: informit   译文出处:cocoachina Core Data是苹果针对Mac和iOS平台开发的一个框架,主要用来储存数据.对很多开发者来说,Core Data比较容易入手,但很难精通,如果没有正确的学习方法,你将很难真正理解它,更不用说精通了.很多开发者常常在这方面犯一些错误,而这篇文章列出了开发者在iOS开发过程中使用Core Data常见的一些错误,并对如何避免这些错误进行了分析.  1.不了解关键术语 对于iOS开发者来说,会使用Core Data是一项必备技能.

iOS Swift学习笔记 Core Data (一)Hello Core Data

正在学习swift的Core Data,做个笔记,顺便分享源码 这个实例是一个很简单的Table,通过右上角的Add按钮可以添加新的用户名.数据存储在CoreData中,这样,才不会丢失. 通过这个例子可以学会: 使用Xcode的model编辑器创建数据对象的model data. 添加新的记录到CoreData中 从CoreData中获取记录集合 显示记录到table view中 这个例子十分简单,还有很多可以改进的地方,比如,每次要操作managed class都需要访问AppDelegat

Core Data 教学

看了一篇国外的文章,关于iOS9的Core Data教学,在这里做了一下总结 Core Data 教学 示例开源地址:LastDayCoreData 在这篇文章中我们将学习Core Data的系列教程,你将使用Swift2.0写你的Core Data.你将发现在Xcode中它是很容易上手的,从启动代码导师数据模型编辑器.在教程结束后,你会了解到: 使用Xcode的model editor将你想存储在Core Data. 添加新的记录到 Core Data 从Core Data中读取一组数据 在表

CoreData学习:Core Data Stack(Swift)

Core Data是苹果官方提供的一套框架,用来解决对象生命周期管理.对象关系图管理和持久化等方面相关的问题.Core Data是模型层的技术,Core Data帮助你构建代表程序状态的模型层.Core Data也是一种持久化技术,它可以将模型的状态持久化到磁盘.但它更重要的特点是:Core Data不只是一个加载和保存数据的框架,它也能处理内存中的数据. 什么是Core Data? 对于Core Data框架将经常困惑,以为是数据库.其实Core Data并不是数据库.如果它不是数据库,那么C

Core Data中的多线程之二

在Core Data中使用多线程一般不是为了能够提高性能和效率,而是为了使主线程能够不被阻塞,使能够在做其他数据操作的时候,UI还能够继续响应用户的行为.当执行fetch操作时,Core Data系统会根据需要自动开启多个线程做相应的操作,因此我们自己添加多线程并不能提高效率,而仅仅是为了能够将主线程丛繁重的数据操作中解脱出来. 苹果官方文档中对Core Data并发操作的说明: Concurrency with Core Data: 1.Use Thread Confinement to Su

手把手教你从Core Data迁移到Realm

来源:一缕殇流化隐半边冰霜 (@halfrost ) 链接:http://www.jianshu.com/p/d79b2b1bfa72 前言 看了这篇文章的标题,也许有些人还不知道Realm是什么,那么我先简单介绍一下这个新生的数据库.号称是用来替代SQLite 和 Core Data的.Realm有以下优点: 使用方便 Realm并不是基于SQLite的对象关系映射数据库.它是使用自己的持久化引擎,为简单和速度而生.用户们说,他们在数分钟之内就上手了Realm,构建一个app只需要数小时,每个

手把手教你从 Core Data 迁移到 Realm

前言 看了这篇文章的标题,也许有些人还不知道Realm是什么,那么我先简单介绍一下这个新生的数据库.号称是用来替代SQLite 和 Core Data的.Realm有以下优点: 使用方便 Realm并不是基于SQLite的对象关系映射数据库.它是使用自己的持久化引擎,为简单和速度而生.用户们说,他们在数分钟之内就上手了Realm,构建一个app只需要数小时,每个app开发时间至少节约数周的时间. 快 Realm比其他的对象关系映射型数据库(Object Relational Mapping),甚

Core Data-备用

Core Data是一个功能强大的层,位于SQLite数据库之上,它避免了SQL的复杂性,能让我们以更自然的方式与数据库进行交互.Core Data将数据库行转换为OC对象(托管对象)来实现,这样无需任何SQL知识就能操作他们. Core Data位于MVC设计模式中的模型层,一般需要在设备上存储结构化数据时,考虑使用SQLite或是序列化等方法,而Core Data是这两种方法的混合体,并增加了一些功能,提供了SQL强大威力,但是用起来又和序列化一样简单.Core Data能将应用程序中的对象

ios开发:Core Data概述

Core Data 概述 2005年的四月份,Apple 发布了 OS X 10.4,在这个版本中 Core Data 框架发布了.Core Data本身既不是数据库也不是数据库访问框架.相反,Core Data是一个完整的数据模型解决方案.可以简单理解为对持久层的封装,使得我们可以通过可视化建立数据模型,简化数据存取.即使不懂SQL语句,也依然可以使用Core Data.因为Core Data将底层的数据库SQL语句封装成了一套API,并可通过可视化操作来建立数据库的模型和表之间的关系,它甚至