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)、建立模型

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


CoreData(一)_第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的名字必须以大写开头
CoreData(一)_第2张图片

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

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

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


(2)、保存数据

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

CoreData(一)_第3张图片
Add按钮添加数据,show按钮显示数据

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

首先,打开viewcontroller.swift,添加头文件“import CoreData”。
然后,在addButton方法内添加以下代码:


//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)")
}

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

  • //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方法中添加以下代码:


//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)")
}

  • //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,结果如下所示:

CoreData(一)_第4张图片
在上方输入框输入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

你可能感兴趣的:(CoreData(一))