coreData学习

1 概念介绍

什么是coreData?

coreData 是一个对象图管理器(object graph management)以及一个 ios与osx的sdk的数据持久化框架(persistence framework)

意思是coreData可以 存储取回数据 但是

他并不是类似Mysql以及 SQLite 一样的关系型数据库
尽管 他可以背后可以使用 sqlite作为数据存储的工具

2 coreData的 Data Model 的配置页面

2.1 entity

core Data中是一个类的定义, 在关系数据库中,对应的就是 table

2.2 attribute

attribute 指的是一个类的属性

2.3 relationship

指的是多个实体间的link。
一对一的link 称为: to-one relationship
一对多的link 称为: to-many relationship

3 kvc key- value coding or KVC.

3.1 如何使用KVC

kvc 是Cocoa和 Cocoa Touch中的一种利用 字符串string来 标示 属性的机制, 从这个角度来说,kvc有些像一个字典dict

所有继承自 NSObject 的类,包括NSManageObjectkvc 都是适用的

对于非继承自 NSObject 的类,是不能使用kvc的。

见如下示例

// 从NSManageObject 中取出属性
cell.textLabel.text = person.valueForKey("name") as String
// 往NSObject 中添加元素
person.setValue(name, forKey: "name")
3.2 不使用kvc的理由

虽然我们可以使用kvc对NSManagedObject 直接的做一系列操作,但是 最大 的问题是,我们是通过字符串在访问对象,而不是 强类型的类 ,各种各样的拼写错误,可能导致很多错误。没有充分的利用xcode的类型检查以及 自动补全 功能

The biggest problem with key-value coding is the fact that you’re accessing of data using strings instead of strongly-typed classes.

3.3 替换kvc,自动生成NSManagedObject Subclass 的方法

最好的更换kvc的方法,就是为data model中出现的每一个entity 编写 NSManagedObject subclass

The best alternative to key-value coding is to create NSManagedObject subclasses for each entity in your data model

编写好的dataModel ,可以直接使用

xcode的editor-> Create NSManagedObject Subclass
来自动生成

类型的定义如下

• String maps to String
• Integer 16/32/64, Float, Double and Boolean map to NSNumber 
• Decimal maps to NSDecimalNumber
• Date maps to NSDate
• Binary data maps to NSData
• Transformable maps to AnyObject

If you want to work directly with primitive data types such as Double and Int32, you could have checked the box next to Use scalar properties for primitive data types in the last dialog when you were generating the managed object subclass

4 coreData的简单使用示例

4.1 save代码 保存 示例代码与解释
func saveName(name: String) { 
//1
let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
let managedContext = appDelegate.managedObjectContext!

//2
let entity = NSEntityDescription.entityForName("Person", inManagedObjectContext:
managedContext)
let person = NSManagedObject(entity: entity!, insertIntoManagedObjectContext:managedContext)

//3
person.setValue(name, forKey: "name")

//4
var error: NSError?
if !managedContext.save(&error) {
println("Could not save \(error), \(error?.userInfo)") }

//5
people.append(person) 
}

代码解释如下

  1. 在save与retrieve数据之前,你首先需要控制一个NSManageObjectContext 的对象, 可以将一个 managed object context 对象看做一个再系统内存中的 managed object的中间结果暂存器。
    把一个managed Object存到 CoreData分为两个步骤
    一. 将一个 managed Object 对象存入 一个managed Object context中
    二. 将你的managed Object context中的改变提交,并存到磁盘中
    xcode中已经在你点击 use coreData的checkbox 的时候,就已经创建了一个 managed Object context作为项目模板的一部分。 这个默认的 moc,是作为 app delegate 的属性 存在的,为了获取 moc , 我们首先需要获取 app delegate 的一个引用 便有了 // 1 的代码
let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
let managedContext = appDelegate.managedObjectContext!

二. 你创建了一个新的 managed object,并且将其 insert进入了 moc
通过使用 NSManagedObjectContext 的构造器。

// 创建一个新的对象
//  NSManagedObject 是一个 “shape-shifter” 他可以表示任何的entity,而NSEntityDescription 则是在运行时用于连接 一个 NSManagedObject的实例 与 entity 的 数据模型
let entity = NSEntityDescription.entityForName("Person", inManagedObjectContext:
managedContext)
// 将对象插入 moc中,使用NSManagedObject的构造器
let person = NSManagedObject(entity: entity!, insertIntoManagedObjectContext:managedContext)

三. 当拥有了一个 NSManagedObject 之后,使用 kvc , 将属性添加到 NSManagedObject中,这里的属性 名称必须和你再datamodel中建立的entity的attribute name要保持一致

person.setValue(name, forKey: "name")

四. // 4 中的代码表示的就是将你的改变提交给 person,并且将它save到disk中。通过调用save的方法。
if there is ever an error with the save operation, you can inspect the error and alert the user if necessary.

4.2 fetch data的代码示例以及解释
if let managedContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext {
            
    let fetchRequest = NSFetchRequest(entityName: "Person")
    var error: NSError?
            
    let fetchedResults = managedContext.executeFetchRequest(fetchRequest, error: &error) as! [NSManagedObject]?
            
    if let results = fetchedResults {
        people = results
    }else {
        println("Can't fetch data \(error), \(error!.userInfo)")
    }
}

其中 fetchrequest 有很多 qualifiers 用于 改进 结果的返回,NSEntityDescription 是其中必备的之一。
代码中 用构造器的方式,获取了特定entity的所有对象

5 entity的类型

大部分的类型都是显而易见的。这里主要介绍两个

  • transformable

利用 transformable 类型,我们可以存储任何类型的数据,甚至是我们自己定义的类型,只要你的类型实现了NSCoding protocol
例如
UIColor conforms to NSSecureCoding, which inherits from NSCoding, so it can use the transformable type out of the box.

  • binary data

可以存储一些二进制数据,比如图片,或者文档。

6 传播context

再4中我们说到,每次首先都要取得 managed object context 这个一个对象,那就要写如下的代码

let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
let managedContext = appDelegate.managedObjectContext!

一次还好,如果每个 controller中都需要有许多个删除以及添加的地方,就会很麻烦。
解决办法还是有的,我们知道,context再程序创建的时候就已经有了。在appdelegate 中。我们需要做的就是将appdelegate中的context传递给相应controller的局部变量。

  • 首先,再viewController中创建一个MOC的变量。
import CoreData
var managedContext: NSManagedObjectContext!
  • 然后,再AppDelegate 中的didfinish方法中添加
let viewController = self.window?.rootViewController as! ViewController
        viewController.managedObjectContext = self.managedObjectContext

这样,日后转场的时候,就可以将这个MOC 的prepareForSegue方法中继续传递下去。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • 本文是对 MagicalRecord github上的翻译 正文:注意: MagicalRecord 在 ARC...
    騂跃神话阅读 1,993评论 1 5
  • Coredata第一课 认识coredata 问题 在iOS/Mac中我们有许多方式去持久化存储数据:NSUser...
    KnowWhy阅读 523评论 0 1
  • 是不是看看我的菜谱,可以帮你分担晚饭吃什么的烦恼? 1.土豆丝呛粉条。 步骤一:土豆擦丝,用水泡五分钟,这样可以让...
    Mogen阅读 435评论 0 1
  • “你说,我们这样逃出来,你师傅和我师傅会不会生气?” 顾长留紧紧抓住手中的缰绳,余光瞧了身侧同在骑马的素衣,“气便...
    三日初醒阅读 1,195评论 0 21
  • 最近参与了“微信公众平台”的开发。俗话说得好:整理知识也是一种知识的重建。为此做一个小小的经验总结,如下。 参考“...
    whybask阅读 696评论 0 1