Xcodetech materials技术

CoreData(一)

2015-04-16  本文已影响14273人  StrongX

最近一直在学习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>

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

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

通过以上四步我们就成功将输入到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>

  • Nete:如果‘寄存器’中没有这个实体的数据,也就是数组中没有对象,那么我们获取的fetchedResults数组是这样的“[]”.
    但是如果请求发生了错误,那么该方法返回的是一个nil,所以我们可以通过if let 来判断是否发生了错误,如果发生了错误我们可以输出error.userInfo来进行一个提示。

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

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

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

  • 储存数据:
    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

上一篇下一篇

猜你喜欢

热点阅读