core data 是ios中后台数据库的管理,其主要是对象的序列化,序列化就是存储的效果
首先是UI的建立 在core data里只有 single view 和 master detail view 才能用core data,记住在创建项目的时候勾上core data
随后是ui的建立 拖进一个 table view controller 随后为其设置navigation controller 随后为其单元格设置,关连文件,创建新的文件 继承自table view controller
在table view controller 中 主要是table view 的建立
首先是存储的数据
//对象数组
var name = [String]()
接着是table view的一些方法的建立
//只有一个单元格
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return name.count
}
//单元格的定义
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell")
// Configure the cell...
//单元格的内容 数组中的每一个字符
cell!.textLabel?.text = name[indexPath.row]
return cell!
}
接着是一个 add的按钮的事件定义 在这其中要弹出一个对话框,来输入姓名和保存,并在table view上显示出来
@IBAction func addName(sender: AnyObject) {
//生成一个弹出的警告框 用于提醒用户来输入数据,分别有两个按钮 一个是保存 一个是取消 记住是alert controller
var alert = UIAlertController(title: "信息", message: "输入新名字", preferredStyle: UIAlertControllerStyle.Alert)
//定义保存的按钮
var saveAction = UIAlertAction(title: "保存", style: UIAlertActionStyle.Default) { (action :UIAlertAction) -> Void in
//姓名添加到数组里买 table view 进行跟新
let textField = alert.textFields![0] as UITextField
self.name.append(textField.text!)
self.tableView.reloadData()
}
//定义取消的按钮
var cancelAction = UIAlertAction(title: "取消", style: UIAlertActionStyle.Default,handler:nil)
//将文本框显示出来
alert.addTextFieldWithConfigurationHandler { (textfield:UITextField) -> Void in
}
//将按钮添加到警告框中
alert.addAction(saveAction)
alert.addAction(cancelAction)
//将警告框展示出来
self.presentViewController(alert, animated: true, completion: nil)
}
mainstoryboard界面就是这样
在table viewcontroller 中的代码就是这样
class tableViewController: UITableViewController {
@IBAction func addName(sender: AnyObject) {
//生成一个弹出的警告框 用于提醒用户来输入数据,分别有两个按钮 一个是保存 一个是取消 记住是alert controller
var alert = UIAlertController(title: "信息", message: "输入新名字", preferredStyle: UIAlertControllerStyle.Alert)
//定义保存的按钮
var saveAction = UIAlertAction(title: "保存", style: UIAlertActionStyle.Default) { (action :UIAlertAction) -> Void in
//姓名添加到数组里买 table view 进行跟新
let textField = alert.textFields![0] as UITextField
self.name.append(textField.text!)
self.tableView.reloadData()
}
//定义取消的按钮
var cancelAction = UIAlertAction(title: "取消", style: UIAlertActionStyle.Default,handler:nil)
//将文本框显示出来
alert.addTextFieldWithConfigurationHandler { (textfield:UITextField) -> Void in
}
//将按钮添加到警告框中
alert.addAction(saveAction)
alert.addAction(cancelAction)
//将警告框展示出来
self.presentViewController(alert, animated: true, completion: nil)
}
//对象数组
var name = [String]()
//用people 来存储 NSManagedObject 是一个字典类型的
var people = [NSManagedObject]()
override func viewDidLoad() {
super.viewDidLoad()
// Uncomment the following line to preserve selection between presentations
// self.clearsSelectionOnViewWillAppear = false
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: - Table view data source
//只有一个单元格
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return name.count
}
//单元格的定义
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell")
// Configure the cell...
//单元格的内容 数组中的每一个字符
cell!.textLabel?.text = name[indexPath.row]
return cell!
}
随后是数据的建模
打开core_data_xcdatamodeled 点击Add Entity 随后输入Person 随后在Attribute中输入name 定义类型为String
这里有一些属性的概念
如果用老的name 属性的话,则在这个程序退出后,系统不会来保存数据,也就是再次打开的时候,tableview还是空白的一片,上一次的输入没有保存,所以要用到core data
//用people 来存储 NSManagedObject 是一个字典类型的
var people = [NSManagedObject]()
table view 中的改动
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return people.count
}
//单元格的定义
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell")
// Configure the cell...
//字典型的 所以用key来进行寻找
let person = people[indexPath.row]
//不知道找出的是什么类型 所以需要强制转化
cell!.textLabel?.text = person.valueForKey("name") as! String?
return cell!
}
在valueForKey中用到了KVC的一些概念 可以了解一下随后就是保存数据 主要是有5个步骤 新增加一个函数,用来保存值的时候应用
//保存数据的函数
func saveName(text:String) {
//1取的总代理和托管对象的内容总管
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
//创建对象的内容总管
let managedObjectContext = appDelegate.managedObjectContext
//2创建一个entity实在core_data.xcdatamodeld中创建的person类
let entity = NSEntityDescription.entityForName("Person", inManagedObjectContext: managedObjectContext)
let person = NSManagedObject(entity: entity!, insertIntoManagedObjectContext: managedObjectContext)
//3保存文本框到person中 name对应的key也是在core data中设好的
person.setValue(text, forKey: "name")
//4保存entity到托管对象的内容总管中 有可能会保存失败,因此要设置error
var error:NSError?
<p class="p1"><span class="s1"> </span><span class="s2">do</span><span class="s1"> { </span><span class="s2">try</span><span class="s1"> managedObjectContext.</span><span class="s3">save</span><span class="s1">()} </span><span class="s2">catch</span><span class="s1"> { </span><span class="s3">fatalError</span><span class="s1">(</span><span class="s4">"Failure to save context: </span><span class="s1">\</span><span class="s4">(</span><span class="s1">error</span><span class="s4">)"</span><span class="s1">)} </span></p>
//5保存到数组中,进行UI的跟新
people.append(person)
}
之后是保存数据的函数的改变
//姓名添加到数组里买 table view 进行跟新
let textField = alert.textFields![0] as UITextField
self.saveName(textField.text!)
self.tableView.reloadData()
之后是获取数据,在第一次加载UI的时候,需要把上次添加好数据后的数据给拿出来,主要是有3个步骤
//来获取数据,用于显示在UI上时,不能在viewdidload中,因为会大量的损耗内存和时间 所以用viewdidappear这个函数
override func viewDidAppear(animated: Bool) {
//调用父类的
super.viewDidAppear(animated)
//总共有3个步骤,第一个步骤还是一样,获得代理和总管托对象
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
//创建对象的内容总管
let managedObjectContext = appDelegate.managedObjectContext
//2 建立 获得fetch的请求
let fetchRequest = NSFetchRequest(entityName: "Person")
//3执行请求,有可能获得是多个数据,因此是一个数组,还有就是有可能获取失败,因此有一个error要定义
var error:NSError?
let fetchRequests = managedObjectContext.executeFetchRequest(fetchRequest) as! [NSManagedObject]
<p class="p1"><span class="s1">do</span><span class="s2"> {</span><span class="s1">let</span><span class="s2"> fetchRequests = </span><span class="s1">try</span><span class="s2"> managedObjectContext.</span><span class="s3">executeFetchRequest</span><span class="s2">(fetchRequest) </span><span class="s1">as</span><span class="s2">! [</span><span class="s3">NSManagedObject</span><span class="s2">]}</span></p><p class="p2"><span class="s4"> </span><span class="s1">catch</span><span class="s4"> { </span><span class="s3">fatalError</span><span class="s4">(</span><span class="s2">"Failure to save context: </span><span class="s4">\</span><span class="s2">(</span><span class="s4">error</span><span class="s2">)"</span><span class="s4">)}</span></p><p class="p1"><span class="s2"> </span><span class="s1">let</span><span class="s2"> people = fetchRequest</span></p><p class="p1"><span class="s2"> </span><span class="s5">//</span><span class="s6">跟新</span><span class="s5">UI</span><span class="s6">界面</span></p><p class="p3"><span class="s4"> </span><span class="s1">self</span><span class="s4">.</span><span class="s2">tableView</span><span class="s4">.</span><span class="s2">reloadData</span><span class="s4">()</span></p><p class="p1"><span class="s2"> }</span></p>
//跟新UI界面
self.tableView.reloadData()
}
else {
print("无法保存 \(error),\(error?.userInfo)")
}
}
不过好像依然在ios9中有错误,具体的等大神解答