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
好,下面创造一个简单的界面,一个tableView,右上角有一个加号,每次点击加号弹出一个AlertViewController,可以给tableView的datasource添加一个名字,如果只是添加String类型,且不考虑持久化,那么就按照一般tableview创建好了,没什么问题,就像这样
那么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)") } }
好,大致流程就是这样,关键注释在代码里