CoreData(一)

作者: StrongX | 来源:发表于2015-04-16 11:08 被阅读14273次
    • 参考书籍: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

    相关文章

      网友评论

      • 明心见性:swift2.0版本更新了语法,现在不能直接使用 let fetchdResults = managedContext.executeFetchRequest(fetchRequest)
        需要写成:
        ````
        do {
        fetchdResults = try managedContext.executeFetchRequest(fetchRequest) as! [NSManagedObject]
        print(fetchdResults)
        for each in fetchdResults {
        let name:String = each.valueForKey("name") as! String
        showTextView.text = showTextView.text + "\(name)"+"\r"
        }
        } catch let error1 as NSError {
        error = error1
        print("can not get \(error), \(error?.userInfo)")
        }
        ````
      • 二挠:@StrongX 谢了兄弟 我知道沙盒就是不知道后面的Fire那个东东 今天我试下
      • StrongX:@二挠 你好,NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        这个方法可以获取沙盒地址,把它打印出来。右击Finder->前往文件,你可以找到一些 .sqlite文件。然后使用SQLite Manager – Firefox的一个图形化管理sql数据库的插件,可以查看相关数据。
      • 二挠:CoreData存得数据在哪里呢?怎么看?有办法看么?

      本文标题:CoreData(一)

      本文链接:https://www.haomeiwen.com/subject/emmsfttx.html