core data的学习

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中有错误,具体的等大神解答

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值