转载

CoreData初体验

CoreData是苹果推出的一种数据持久化的方式,底层实现其实就是SQLite,使用起来也比直接的SQL语句控制SQLite方便,这里做一个最简单的体验,把Person的实体(相当于SQLite中一个table)持久化,Person实体里面有个字段叫做name

首先创建一个工程,创建的时候勾选Core Data,这样就会发现AppDelegate里面就有了很多关于CoreData的代理方法,同时项目里创建了XXXXXXX.xcdatamodeld文件,可以理解为对SQLite的一种抽象,里面的ENTITIES就是实体,相当于一个table,Entities的Attributes相当于table的一个字段。那么下面创建一个叫做Person的实体,在Attributes添加一个叫做name的字段,类型是String

CoreData初体验

好,下面创造一个简单的界面,一个tableView,右上角有一个加号,每次点击加号弹出一个AlertViewController,可以给tableView的datasource添加一个名字,如果只是添加String类型,且不考虑持久化,那么就按照一般tableview创建好了,没什么问题,就像这样

CoreData初体验

那么App一被kill,再次打开添加的这些名字应该就已经没了,那么现在改造为利用coreData的持久化,直接看代码

首先,ViewController里面得有一个people数组,这个数组里面储存的是Entity实体

var people = [NSManagedObject]()

然后加号的操作,主要干的一件事情就是调用了UIAlertController,弹出输入名字的文本框,然后调用saveName方法把名字持久化下来

@IBAction func addName(sender: AnyObject) {          var alert = UIAlertController(title: "New name",              message: "Add a new name",              preferredStyle: .Alert)          let saveAction = UIAlertAction(title: "Save",              style: .Default) { (action: UIAlertAction!) -> Void in                  let textField = alert.textFields![0] as! UITextField                  self.saveName(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)      }

下面看向CoreData里存数据的saveName方法

//向CoreData里存数据      func saveName(name: String) {          //使用CoreData之前,要先获得NSManagedObjectContext,就像CoreGraphic绘图前要先获得Context一样          //创建项目如果选择了use CoreData,那么AppDelegate就会获得managedObjectContext属性          let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate          let managedContext = appDelegate.managedObjectContext!          //获取managedContext里名字为Person的entity         let entity =  NSEntityDescription.entityForName("Person",              inManagedObjectContext:              managedContext)          //通过entity创建person这个NSManagedObject对象         let person = NSManagedObject(entity: entity!,              insertIntoManagedObjectContext:managedContext)                    //用key-value编码设置name属性          person.setValue(name, forKey: "name")                    //使用managedContext的save方法保存entity到磁盘上          var error: NSError?          if !managedContext.save(&error) {              println("Could not save /(error), /(error?.userInfo)")          }                     people.append(person)      }

tableView展现的时候要用KVO形式获取entity的name字段

func tableView(tableView: UITableView,          cellForRowAtIndexPath          indexPath: NSIndexPath) -> UITableViewCell {              let cell =              tableView.dequeueReusableCellWithIdentifier("Cell")                  as! UITableViewCell              let person = people[indexPath.row]              cell.textLabel!.text = person.valueForKey("name") as! String                            return cell      }

那么,people数组是怎么从CoreData持久化数据里取出来的呢

//从CoreData里取数据      override func viewWillAppear(animated: Bool) {          super.viewWillAppear(animated)                    //获取NSManagedObjectContext          let appDelegate =          UIApplication.sharedApplication().delegate as! AppDelegate                    let managedContext = appDelegate.managedObjectContext!                    //NSFetchRequest类用于从CoreData里面抓取数据,理解为SQL的SELECT语句         let fetchRequest = NSFetchRequest(entityName:"Person")                    //返回结果          var error: NSError?                    let fetchedResults =          managedContext.executeFetchRequest(fetchRequest,              error: &error) as! [NSManagedObject]?                    if let results = fetchedResults {              people = results          } else {              println("Could not fetch /(error), /(error!.userInfo)")          }      }

好,大致流程就是这样,关键注释在代码里

正文到此结束
Loading...