swift3.0 coreData的使用-日记本demo

摘要:
效果需求分析基于官方MasterDetail模板。官方已经编写了许多复杂的核心数据逻辑,在此基础上,简单的日志程序得到了快速开发。)//保存到数据库自身。saveData(context:context!.popViewController}//保存数据funcsaveData{do{trycontext.Save()}catch{letserror=errorasNSErrorfallError}}在navBarRight上添加一个按钮以保存overridefuncviewDidLoad(){super.viewDidLoad()//添加保存按钮letsaveBtn=UIBarButtonItemself.navigationItem.rightBarButtonItems=saveBtnself.title=“Write something”Self.configureView()}//配置接口显示日志内容funcconfigureView(){ifletdetail=self.detailItem{iflet textView=self.detail textView{textView.text=detail.noteDetail!让我们更改添加按钮的方法并将其推到新页面。//插入新的记事本funinsertNewObject{//初始化插入时间戳和空数据letcontext=self.fetchedResultsController.managedObjectContextletnewEvent=EventnewEvent.timestamp=NSDate()newEvent.noteDetail=“”//保存做{trycontext.Save()}catch{letserror=errorsNSErrorfallError}//pushletstore=UIStoryboardletcontroller=story。实例化ViewControlleras!
效果

效果.gif

需求分析

基于官方MasterDetail模板,官方写了很多复杂的coredata逻辑,在此基础上快速开发简单的日记本程序。

- 主要功能:增、删、改、查
- 界面用默认的界面,将detail页面改为`UITextView`可编辑
- 主页面进行 增、删、查操作
- 子页面进行 删、改、查操作

需求很简单,官方模板还添加了按时间排序的操作

创建工程

选择 M-D模式
M-D.png
使用swift和coredata

选择语言和coredata.png

添加数据库

官方给数据库添加了一个时间戳字段,我们再添加一个内容字段就可以了
添加字段.png

改写Detail页面

改成textview,读取数据库中的noteDetail内容字段
需要增加保存和删除操作
由于设置了detailItem:Event 这个全局变量是由上一级传递过来的,我们就可以对这行内容直接进行操作

    //当前entity
    var detailItem: Event? {
        didSet {
            // Update the view.
            self.configureView()
        }
    }
//删除
    @IBAction func deleteNote(_ sender: Any) {
        print("deleted")
        let context = self.detailItem?.managedObjectContext
        context?.delete(self.detailItem!)
          //保存到数据库
        self.saveData(context: context!)
        _ = self.navigationController?.popViewController(animated: true)

    }
//保存数据
    func saveObject() {
        print("saved")
        let newEvent = self.detailItem
        let context = self.detailItem?.managedObjectContext
        newEvent?.noteDetail = self.detailTextView.text
        newEvent?.timestamp = NSDate()
        //保存到数据库
        self.saveData(context: context!)
        //返回
        _ = self.navigationController?.popViewController(animated: true)
    }
    //保存数据
    func saveData(context:NSManagedObjectContext) {
        do {
            try context.save()
        } catch {
            let nserror = error as NSError
            fatalError("Unresolved error (nserror), (nserror.userInfo)")
        }
    }

在navBarRight上增加一个按钮用于保存

    override func viewDidLoad() {
        super.viewDidLoad()
        //增加保存按钮
        let saveBtn = UIBarButtonItem(barButtonSystemItem: .save, target: self, action: #selector(saveObject))
        self.navigationItem.rightBarButtonItem = saveBtn
        self.title = "写点什么吧..."   
        self.configureView()
    }
    //配置界面 显示日志内容
    func configureView() {
        if let detail = self.detailItem {
            if let textView = self.detailTextView {
                textView.text = detail.noteDetail!.description
            }
        }
    }
改写Master页面
- 更改cell展示内容
- 点击cell的页面
- 更改新增日志按钮的方法
- 新增刷新tableview
  • 更改cell展示内容
    cell没有太多要更改的 只是显示样式更改下就行
    //配置cell内容
    func configureCell(_ cell: UITableViewCell, withEvent event: Event) {
        cell.textLabel!.text = event.noteDetail?.description
        cell.detailTextLabel!.text = event.timestamp!.description
    }
  • 点击cell的页面
    由于默认的M-D页面模式 点击cell是直接指向D页面,我们把他删掉,写到tableview的didSelectRowAt方法中,使用navigationController并传递当前查询出来的数据对象
    我这里是使用stroyboard ID来获取视窗
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        //点击cell push
        let object = self.fetchedResultsController.object(at: indexPath)
        let story = UIStoryboard(name: "Main", bundle: Bundle.main)
        let controller = story.instantiateViewController(withIdentifier: "detail") as! DetailViewController
        controller.detailItem = object
        self.navigationController?.pushViewController(controller, animated: true)
    }
  • 更改新增日志按钮的方法
    默认模式是点击新增直接tableview多一行数据,我们这里的需求则是进入新增的编辑页面。
    我们给新增按钮的方法更改一下,push到新页面就可以了
    //插入新记事本
    func insertNewObject(_ sender: Any) {
        //初始化 插入时间戳 和 空数据
        let context = self.fetchedResultsController.managedObjectContext
        let newEvent = Event(context: context)
        newEvent.timestamp = NSDate()
        newEvent.noteDetail = ""
        //保存
        do {
            try context.save()
        } catch {
            let nserror = error as NSError
            fatalError("Unresolved error (nserror), (nserror.userInfo)")
        }
   
        //push
        let story = UIStoryboard(name: "Main", bundle: Bundle.main)
        let controller = story.instantiateViewController(withIdentifier: "detail") as! DetailViewController
        controller.detailItem = newEvent
        self.navigationController?.pushViewController(controller, animated: true)
    }
  • 新增刷新tableview
    由于返回机制是由navigationController来控制的,我们需要在D页面返回时刷新一下tableview,重读数据库,让新数据能展现出来
override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        //返回时刷新数据
        self.tableView.reloadData()
    }
Demo地址

https://github.com/gongxiaokai/SimpleNote

免责声明:文章转载自《swift3.0 coreData的使用-日记本demo》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇性能优化工具---topPHP min() 函数下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android 自己实现更新下载自动安装

1、一些公司开发完一款App之后可能并不会去上架App商店,但事后期也需要定时进行维护更新,所以会选择把打包好的apk 发布到自己的服务器,然后在数据库建一个版本号的表,然后剩下的就交给你android开发了,android自己要实现版本检测更新,由于android自带的DownloadManager 就可以实现下载功能,用起来就会很简单了,不用再写很多下...

android 内存泄漏,以及检测方法

1、为什么会产生内存泄漏 当一个对象已经不需要再使用本该被回收时,另外一个正在使用的对象持有它的引用从而导致它不能被回收,这导致本该被回收的对象不能被回收而停留在堆内存中,这就产生了内存泄漏。 2、内存泄漏对程序的影响 内存泄漏是造成应用程序OOM的主要原因之一。我们知道Android系统为每个应用程序分配的内存是有限的,而当一个应用中产生的内存泄漏比较多...

利用LDAP操作AD域

LDAP操作代码样例  初始化LDAP 目录服务上下文 该例子中,我们使用uid=linly,ou=People,dc=jsoso,dc=net这个账号,链接位于本机8389端口的LDAP服务器(ldap://localhost:8389),认证方式采用simple类型,即用户名/密码方式。 private static void initialConte...

android中getSystemService详解

http://blog.sina.com.cn/s/blog_71d1e4fc0100o8qr.html http://blog.csdn.net/bianhaohui/article/details/6220135       android的后台运行在很多service,它们在系统启动时被SystemServer开启,支持系统的正常工作,比如Mount...

Android从相册获取图片

应用中经常会有去相册获取图片的需求,每次总是会忘,现在这做个记录,以便以后查阅。 从应用去相册获取图片主要有以下几个步骤: 1、设置intent调用系统相册 2、进入相册选取图片,如果相册没有满意的图片,可以使用相机照相获取,最后返回数据到应用 3、应用获取图片后,调用裁剪程序对图片进行裁剪 4、返回裁剪的图片并显示出来 一、设置intent调用系统相册,...

Android-操作系统拨打电话广播的处理

Android操作系统的 packages/apps/phone/AndroidManifest.xml源码阅读 在之前的博客,Android-隐式意图激活操作系统通话界面,讲解了,阅读Android操作系统的 packages/apps/phone/AndroidManifest.xml,是如何暴露的 ...... 等等  Android操作系统的...