第一章:你的第一个Core Data App

注:本文来自Core Data by tutorials 2.0 , swift + iOS 9 .

本章你将会编写你第一个Core Data App,你将会发现Xcode提供的这些资源多么容易上手。

学完本章,你将会掌握以下知识:

  • 使用Xcode的模型编辑器(model editor)将你想保存的数据模型(model data)保存到Core Data
  • 向Core Data中新增记录
  • 从Core Data中取回一组记录
  • 将取回的结果用tableView展示出来

开始

打开Xcode创建一个Single View Controller , 给App起名为HitList确认勾选Use Core Data选项:

创建项目

选择Use Core Data后使 Xcode 在AppDelegate 中产生被称为Core Data stack(Core Data 堆栈)的代码示例。

Core Data stack由一套促进从Core Data中存储和获取信息的对象组成,一个管理Core Data 全局状态,一个代表数据模型,还有一些其他的对象。

你将会在这章了解这些对象。稍后,你还要写你自己的Core Data stack。标准的stack可以很好的应用在很多app中,但是基于你的app和数据,你可以自定义stack使他更高效。

注意:不是所有的Xcode模板都有Core Data选项,在Xcode 7中,只有Master-Detail ApplicationSingle View Application 模板有Use Core Data选项。

这个示例代码很简单。一个简单的tableview有一些names列表title为"hit list". 你可以给列表新增names,最后你将使用Core Data确认这些数据已经被持久的存储。你可以把他改成"Favorites list"或者其他你喜欢的。

点击Main.storyboard打开Interface Builder。下一步,嵌入一个navigation controller.在Xcode上选择Editor菜单,选择Embed In然后Navigation Controller

嵌入Navigation Controller

从对象库拖一个Table View放在View Controller上使它覆盖整个view。

如果还没有覆盖,可以打开Interface Builder的文档框选择Table View,按住ctrol拖到他的父视图也就是View上,选择Leading Space to Container Margin约束。

选择约束

再重复上面的操作三次,选择约束Trailing Space to Container Margin,** Vertical Spacing to Top Layout GuideVertical Spacing to Bottom Layout Guide**。如果你熟悉Auto Layout,你就会认识这些约束是用来约束table view的size跟他父视图size的关系。

下一步,拖一个Bar Button Item放在viewController的导航条上。双击item将文本改为Add , 你的面板现在看起来应该如下图:

截图

每次你点击右上角的Add,都要弹出一个包含文本框的弹出框。你可以在里面写上某某的姓名,弹出框消失的时候你要保存name刷新tableView。

在你做这些之前,你需要将viewController设为tableView的数据源,选择table View ,Ctrl-drag(按住ctrol拖动,以后都用Ctrl-drag)导航栏上面的黄色viewController图标,如下图所示,然后选择dataSource

设置数据源

为了不让你混淆,你不需要添加delegate,因为点击cell不需要任何行为。

打开Assistant Editor。Ctrl-drag tableView到ViewController.swift,去添加一个outlet的定义。

截图

将新的IBOutlet属性命名为tableView,下面是结果:

@IBOutlet weak var tableView: UITableView!

Ctrl-drag那个Add 按钮到ViewController.swift ,创建一个Action起名为addName:

@IBAction func addName(sender: AnyObject) {

}

ViewController.swift添加一个属性

//Insert below the tableView IBOutlet
var names = [String]()

names是一个可变数组用来保存string数据供tableView展示

在viewDidLoad()中做如下改变:

override func viewDidLoad() {
    super.viewDidLoad()
    title = "\\"The List\\""
    tableView.registerClass(UITableViewCell.self,forCellReuseIdentifier: "Cell")
}

上面的代码将会设置一个title,注册一个UITableViewCell类,为了复用。

viewController将实现UITableViewDataSource协议、

class ViewController: UIViewController, UITableViewDataSource {

Xcode这时候会报红,没有实现协议中必须实现的方法。实现下面的数据源方法:

// MARK: UITableViewDataSource
func tableView(tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
      return names.count
}
func tableView(tableView: UITableView,cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
      let cell = tableView.dequeueReusableCellWithIdentifier("Cell")
      cell!.textLabel!.text = names[indexPath.row]
      return cell!
}

如果你以前用过UITableView,这段代码应该很熟悉,第一个方法返回tableVIew将会有多少行,第二个方法使tableViewCell出列,然后数组对应的值赋给他的textLabel来显示

先别急着运行程序,首先,你需要一个添加names的方式,这样tableview才能展示他们。

实现addName方法:

//Implement the addName IBAction
@IBAction func addName(sender: AnyObject) {
      let alert = UIAlertController(title: "New Name",message: "Add a new name",preferredStyle: .Alert)
      let saveAction = UIAlertAction(title: "Save",style: .Default,handler:{(action:UIAlertAction) -> Void in
      let textField = alert.textFields!.first
      self.names.append(textField!.text!)
      self.tableView.reloadData()
  })
let cancelAction = UIAlertAction(title: "Cancel",style: .Default) { (action: UIAlertAction) -> Void in
      
}
alert.addTextFieldWithConfigurationHandler {(textField: UITextField) -> Void in

}
    alert.addAction(saveAction)
    alert.addAction(cancelAction)
    presentViewController(alert,animated: true,completion: nil)
}

每次你点击Add按钮的时候,这个方法将会展示一个弹出框(UIAlertController),框上有两个按钮,Save和Cancel 。

这里save不管text是否正确,把它加入name数组,重新加载tableView。因为names是tableview的数据支持,你在textfield输入任何值,save后都会显示在tableview。

最后,是时候编译运行你的app了,点击Add按钮,弹出框将会展示如图:

配图

添加几条数据,你的界面将会展示如下图:

配图

你的表视图将会展示数组的数据,但是我们少了持久化。数组的数据是存在内存的,如果你退出app,重启设备,再进app的时候list就被清空了。

Core Data提供了持久化,意味着他可以将数据更长久的存储,就算重新加载或者重启设备,数据依然存在。

你现在还没有添加任何Core Data , 所以当你退出你的app后他将不会存储任何东西。我们来测试下,点击home键 , 如果你使用的模拟器。按Shift+⌘+H 。回到home界面。

配图

下面主要说下步骤

  • 添加Entity(实体)
配图

点击添加,默认名是Entity,选中回车 改名位People

在Attribute那里添加一个属性

name

下面简单在代码中对name进行存取

  • 存取

前面声明字符串数组的地方替换成

 var people = [NSManagedObject]()

cell中显示的时候用kvc取值

 // MARK: - tableView cell单元格信息
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)
        let person = people[indexPath.row]
        cell.textLabel?.text = person.valueForKey("name") as? String 
        return cell
}

添加按钮 保存操作

 //MARK: -添加元素
  @IBAction func addItem(sender: AnyObject) {
  let alert = UIAlertController(title: "新姓名", message: "添加新姓名", preferredStyle: .Alert)
   let save = UIAlertAction(title: "保存", style: .Default) { (action) -> Void in
            let textField = alert.textFields!.first
            self.saveName(textField?.text)  //这里保存到coredata
            self.tableView.reloadData()
        }
        let cancel = UIAlertAction(title: "取消",
                style: .Default) { (action: UIAlertAction) -> Void in
        }
        
        alert.addTextFieldWithConfigurationHandler {
            (textField: UITextField) -> Void in
        }
        alert.addAction(cancel)
        alert.addAction(save)
        presentViewController(alert,
            animated: true,
            completion: nil)
    }
    
    
    //存储name
    func saveName(value:String?){
        let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        let managedContext = appDelegate.managedObjectContext
        let entity = NSEntityDescription.entityForName("People", inManagedObjectContext: managedContext)
        let person = NSManagedObject(entity: entity!,insertIntoManagedObjectContext: managedContext)
        person.setValue(value, forKey: "name")
        do {
            try managedContext.save()
            //5
            people.append(person)
        } catch let error as NSError {
            print("Could not save \(error), \(error.userInfo)")
        }
    }

第二次进页面的时候 去取值

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        let managedContext = appDelegate.managedObjectContext
        let fetchRequest = NSFetchRequest(entityName: "People")
        do {
            let results =
            try managedContext.executeFetchRequest(fetchRequest)
            people = results as! [NSManagedObject]
        } catch let error as NSError {
            print("Could not fetch \(error), \(error.userInfo)")
        }
        
    }

代码不是很难理解 这些属性 都加在appdelegate中 建议看原版

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

推荐阅读更多精彩内容