CoreData(一)

  • 参考书籍:CORE DATA by Tutorials
  • 默认有swift基础。

最近一直在学习CoreData相关内容,在这里做一个总结,总结分篇组成,以供自己和他人学习参考。

Core Data 是一个在OS X和iOS SDKs中对象图形化管理以及持久化的框架。这意味着Core Data可以用来存储以及获取数据,但这并不是一个关系型数据库如同MySQL和SQLite。但是事实上Core Data使用的是SQLite来存储数据的。我的理解是Core Data是苹果对SQLite的进一步升级,使你可以不用关注数据的存储而把重心放在对象的增删改查。

这一篇主要内容:

1、使用Xcode建立CoreData模型。
2、添加数据。
3、读取数据。


(1)、建立模型

建立一个新工程,如下图所示。


注意红色选择框的勾得勾选

Note:在xcode6中只有Master-Detail Application 和Single View Application这两个模板有这个勾选框。

你会发现AppDelegate.swift文件中多出了一些代码,以及多了一个CoreDataTest1.xcdatamodeld文件。
AppDelegate.swift中多出的代码暂且不用管他,在后面我们会用到。

点击*.xcdatamodeld文件,点击Add Entity按钮添加Entity,将其重新命名为Test,在右边的Attributes栏点击加号,添加一个Attribute,并将type选择为Sring。

  • Note:Entity的名字必须以大写开头

这样你就添加了一个Entity实体,叫做Test,这个实体有一个属性名为name,为String类型。在这里解释一下这几个名词的意义:

  • Entity:相当于coredata中的类。
  • Attribute:如果entity是类的话,attribute就是类的属性,各自为不同类型。
    (还有一些其他属性在后面的章节会介绍。)

通过以上操作我们就成功的创建了一个CoreData的Model。


(2)、保存数据

为了方便演示,我们取消AutoLayout,并拖入几个UI控件,制作一个简单的Demo。

Add按钮添加数据,show按钮显示数据

好的,接下来就是添加数据的相关操作。

首先,打开viewcontroller.swift,添加头文件“import CoreData”。
然后,在addButton方法内添加以下代码:
<pre><code>
//1
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext!
//2
let entity = NSEntityDescription.entityForName("Test", inManagedObjectContext:
managedContext)
let test = NSManagedObject(entity: entity!, insertIntoManagedObjectContext:managedContext)
//3
let name = self.addTextField.text
test.setValue(name, forKey: "name")
//4
var error: NSError?
if !managedContext.save(&error) {
println("Could not save (error), (error?.userInfo)")
}
</code></pre>

让我来解释一下这一段代码:

  • //1 在我们想要保存或者获取任何数据之前我们必须获取NSManagedObjectContext,你可以把这个东西理解为暂存器。
    (这个对象就是我们前面提到的AppDelegate中自动生成的代码之一,如果你在创建工程的时候勾选了‘Use Core Data’)
    我们通过 Application.delegate 获取了xcode自动生成的‘暂存器’。

  • //2 好的,经过上一步我们拥有了一个暂存器,现在我们想保存对象的首先得创造这个对象,这个对象是NSManagedObject类型的,通过初始化方法:
    init(entity:insertIntoManagedObjectContext:)
    这个方法给我们的entity也就是实体创建了一个能加入到‘暂存器’中的对象。

    NSEntityDescription.entityForName(entityName: String, inManagedObjectContext context: NSManagedObjectContext)
    

这个方法按照名字寻找到我们设定的entity,并且和我们的‘暂存器’连接起来。

  • //3 上一步我生成了一个NSManagedObject对象,这个对象有一个属性“name”,这一步做的就是给这个属性赋值。
    test.setValue(name, forKey: "name")
    key-value大家应该不会陌生。这样,我们新创建的对象的属性就有了值,这个值就是我们输入到输入框的值。
    到这一步,我们的entity有了值,并且我们的entity已经进入添加到了‘暂存器’中。
  • //4 我们前面一直在说存到‘暂存器’中,既然是‘暂存器’,那么最后一步就是把‘暂存器’中的东西存到磁盘中。保存的方法很简单:
    managedContext.save(&error)
    error是存盘发生错误时产生错误原因,一个好的app必须对各种error进行处理。

通过以上四步我们就成功将输入到TextField中的字符串存到了磁盘中


(3)、读取数据

这一部分我们的目标是将前面存入磁盘的内容再从磁盘中读出来,并在TextView中显示。
在showButton方法中添加以下代码:

<pre><code>
//1
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext!
//2
let fetchRequest = NSFetchRequest(entityName:"Test")
//3
var error: NSError?
let fetchedResults = managedContext.executeFetchRequest(fetchRequest, error: &error) as! [NSManagedObject]?
if let results = fetchedResults {
for each in results{
let name:String = each.valueForKey("name") as! String
self.showTextView.text = self.showTextView.text + name + "\n"
}
}else {
println("Could not fetch (error), (error!.userInfo)")
}
</code></pre>

  • //1 前面已经说过,不管是储存还是读取数据,首先得获取managedObjectContext对象,获取方法与之前相同,通过Application delegate的方式获取。
  • //2 想要读取数据,第二步就是告诉系统想要的读取数据的entity
    let fetchRequest = NSFetchRequest(entityName:"Test")
    NSFetchRequest这是对‘寄存器发出请求,告诉‘寄存器’’我们要获取数据的实体。
  • //3 通过前两步,我们已经有了‘寄存器’,以及想要获取数据的实体的请求。那么这一步对‘寄存器’发出请求,就可以返回一个数组,这个数组包括了所有符合要求的实体,每一个实体都是我么之前存进去的对象。
    let fetchedResults = managedContext.executeFetchRequest(fetchRequest, error: &error) as! [NSManagedObject]?
    fetchedResults就是这个包含所有‘Test’对象的数组,我们用一个for in 函数将数组中的每一个对象都读出来
    let name:String = each.valueForKey("name") as! String
    .valueForkey(String)函数可以将对象中的属性的值读出来
  • Nete:如果‘寄存器’中没有这个实体的数据,也就是数组中没有对象,那么我们获取的fetchedResults数组是这样的“[]”.
    但是如果请求发生了错误,那么该方法返回的是一个nil,所以我们可以通过if let 来判断是否发生了错误,如果发生了错误我们可以输出error.userInfo来进行一个提示。

好的,我们通过以上操作就将数据读取出来并显示在了TextView中,我们来操作一下app,结果如下所示:

在上方输入框输入name,点击Add按钮就添加到了数据库中,点击show按钮就将已添加的name显示在下方的TextView中

在以上内容中我们学习了这些知识点:

  • data models
  • entities
  • attributes
  • managed objects
  • managed object contexts
  • fetch requests.
    再来总结一下:
  • 储存数据:
    1、获取‘暂存器’——NSManagedObjectContext。
    2、声明想要储存的实体对象NSManagedObject。
    用test.setValue(name, forKey: "name")方法给声明的实体对象的属性赋值
    3、保存
  • 读取数据
    1、获取‘暂存器’——NSManagedObjectContext。
    2、创建请求NSFetchRequest
    3、
    managedContext.executeFetchRequest(fetchRequest, error: &error) as! [NSManagedObject]?
    方法返回数据,该数据是一个包括所有符合要求的实体对象的数组。
    如果发生错误,方法返回nil。

这一篇中我们进行了简单的存贮以及读取操作,下一篇中我们会对CoreData进行更多的操作。
源代码已上传github:https://github.com/superxlx/CoreDataTest1

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

推荐阅读更多精彩内容