【Swift学习笔记-《PRODUCT》读书记录-CoreData数据存储】

《PRODUCT》中小记记录的文字信息,都是使用CoreData存储在本地的。下面将详细介绍,如何在xcode8中使用CoreData。

首先新建一个数据模型文件Diary.Xcatamodeld文件,如图:

选中这个数据库文件,右边可以给这个表增加属性字段

完成后,选中该文件,点击Editor菜单中的,“Ctreate NSManageObject Subclass”导出生成NSManagedObject

然后再对数据库文件做初始化,在appdelegate中创建managedObjectModel

  lazy var managedObjectModel: NSManagedObjectModel = {
        // 描述数据模型描述文件存储位置
        let modelURL = Bundle.main.url(forResource: "DiaryText", withExtension: "momd")!
        return NSManagedObjectModel(contentsOf: modelURL)!
    }()

创建persitentStoreCoordinator持久化管理

  lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = {
        // 通过 managedObjectModel 创建持久化管理
        var coordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel:self.managedObjectModel)

        let url = self.applicationDocumentsDirectory.appendingPathComponent("DiaryText2.sqlite")
        // 设定数据库存储位置

        var error: NSError? = nil
        var failureReason = "载入程序存储的数据出错."

        do {
            try coordinator!.addPersistentStore(
                ofType: NSSQLiteStoreType, configurationName: nil,
                at: url, options: nil)
            // 创建NSSQLiteStoreType类型持久化存储
        } catch var error1 as NSError {
            error = error1
            coordinator = nil
            // 报告错误
            var dict = [String: AnyObject]()
            dict[NSLocalizedDescriptionKey] = "无法初始化程序存储的数据" as AnyObject?
            dict[NSLocalizedFailureReasonErrorKey] = failureReason as AnyObject?
            dict[NSUnderlyingErrorKey] = error
            error = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict)
            NSLog("发现错误 \(error), \(error!.userInfo)")
            abort()
        } catch {
            fatalError()
        }

        return coordinator
    }()

创建managedObjectContext数据库上下文:

lazy var managedObjectContext: NSManagedObjectContext? = {
        let coordinator = self.persistentStoreCoordinator
        if coordinator == nil {
            return nil
        }
        var managedObjectContext = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
        managedObjectContext.persistentStoreCoordinator = coordinator
        return managedObjectContext
    }()

因为后续会项目中会时常使用上下文,所以在appdelegate中定义了一个常量

// Coredata
let appDelegate = UIApplication.shared.delegate as! AppDelegate

let managedContext = appDelegate.managedObjectContext!

到这里数据库基本初始化完成。接下来就是保存数据了,点击完成按钮保存数据

func ednBtnClick() { // 保存数据
        self.titleView.endEditing(true)
        self.contentView.endEditing(true)
        if contentView.text.lengthOfBytes(using: String.Encoding.utf8) > 0 {
            let entity =  NSEntityDescription.entity(forEntityName: "DiaryText", in: managedContext)

            let newdiary = DiaryText(entity: entity!,
                                 insertInto:managedContext)
            newdiary.context = contentView.text
            newdiary.location = "123"
            if titleView.text.lengthOfBytes(using: String.Encoding.utf8) > 0 {
                newdiary.title = titleView.text
            }
            var error:NSError?
            do{
                try managedContext.save()

            }catch let error1 as NSError{
                error = error1
                print("保存出错\(error),\(error?.userInfo)")
            }

        }

         self.navigationController?.popToRootViewController(animated: true)
    }

还可以自行在diary数据库文件中扩展方法。

接下来介绍怎么从CoreData中查询想要的信息。

  // 查询数据

        do {
            // 新建查询
            let fetchRequest = NSFetchRequest<DiaryText>(entityName:"DiaryText")

            // 排序方式
            fetchRequest.sortDescriptors = [NSSortDescriptor(key: "created_at", ascending: true)]

            // 排序方式
            fetchRequest.sortDescriptors = [NSSortDescriptor(key: "context", ascending: true)]

            fetched = NSFetchedResultsController(fetchRequest: fetchRequest,
                                                                  managedObjectContext: managedContext, sectionNameKeyPath: "year",
                                                                  cacheName: nil)

            // 建立委托关系
//            fetchedResultsController.delegate = self

            // 尝试查询
            try self.fetched.performFetch()

            if (fetched.fetchedObjects!.count == 0){
                print("没有存储结果")
            }else{
                if let sectionsCount = fetched.sections?.count {
                    yearsCount = sectionsCount
                    diartys = fetched.fetchedObjects!
                }else{
                   yearsCount = 1
                   sectionsCount = 0
                }

            }

        } catch let error as NSError {
            NSLog("发现错误 \(error.localizedDescription)")
        }
        for obj in diartys{
            print("\(obj.context),,,\(obj.title)")
//            managedContext.delete(obj)
        }

    }

以上便是CoreData使用介绍

时间: 2024-08-05 08:50:04

【Swift学习笔记-《PRODUCT》读书记录-CoreData数据存储】的相关文章

【转载】OpenStack Swift学习笔记

免责声明:     本文转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除.     原文作者:崔炳华      原文地址:http://blog.csdn.net/i_chips/article/details/17787017 1       概述 OpenStack Object Storage(Swift)是OpenStack开源云计算项目的子项目之一.Swift的目的是使用普通硬件来构建冗余的.可扩展的分布式对象存储集群,存储容量可达PB级. Swift并不是

Swift学习笔记:类和结构

一.类和结构的异同 类和结构有一些相似的地方,它们都可以: 1. 定义一些可以赋值的属性: 2. 定义具有功能性的方法 3. 定义下标,使用下标语法 4. 定义初始化方法来设置初始状态 5. 在原实现方法上的可扩展性 根据协议提供某一特定类别的基本功能 1. 类还有一些结构不具备的特性: 2. 类的继承性 3. 对类实例实时的类型转换 4. 析构一个类的实例使之释放空间 5. 引用计数,一个类实例可以有多个引用 1. 定义语法 struct Name{ let firstName = "&quo

Linux程序设计学习笔记----网络编程之网络数据包拆封包与字节顺序大小端

网络数据包的封包与拆包 过程如下: 将数据从一台计算机通过一定的路径发送到另一台计算机.应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation),如下图所示: 不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据包(packet),在链路层叫做帧(frame).数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理. 上图对应两台计算机在同一网段中的情况,

Swift学习笔记(13)--属性 (Properties)

普通属性用var和let即可,本文不做详述 1.延迟存储属性 延迟存储属性是指当第一次被调用的时候才会计算其初始值的属性.在属性声明前使用@lazy来标示一个延迟存储属性. class DataImporter { /* DataImporter 是一个将外部文件中的数据导入的类. 这个类的初始化会消耗不少时间. */ var fileName = "data.txt" // 这是提供数据导入功能 } class DataManager { @lazy var importer = D

Swift学习笔记(11)--类与结构体

类与结构是编程人员在代码中会经常用到的代码块.在类与结构中可以像定义常量,变量和函数一样,定义相关的属性和方法以此来实现各种功能. 和其它的编程语言不太相同的是,Swift不需要单独创建接口或者实现文件来使用类或者结构.Swift中的类或者结构可以在单文件中直接定义,一旦定义完成后,就能够被直接其它代码使用. 注意:一个类的实例一般被视作一个对象,但是在Swift中,类与结构更像是一个函数方法,在后续的章节中更多地是讲述类和结构的功能性. 1.类和结构的异同 类和结构有一些相似的地方,它们都可以

Swift学习笔记五:循环和条件语句

一.循环语句 1. for循环 1) for -in 循环,对于数据范围,序列,集合等中的每一个元素,都执行一次 for a in 0...5{}    //循环迭代,从a=0到a=5,执行{}里的代码 注意:a只循环中存在,也就是出了{}a就不存在了 或者遍历数组 let a = [1,2,3] for b in a{} //循环迭代,从b=1到b=3 如果你不需要序列中的每一个值,可以使用_来忽略它,仅仅只是使用循环体本身: for _ in 0...5{}    //循环执行{}里的代码,

《MyCat 学习笔记》第八篇.数据分片 之 求摸运算分片

1 应用场景 Mycat 自带了多套数据分片的机制,其实根据数值取摸应该是最简单的一种. 优点:数据离散概率较为平均,可以有效的提高应用的数据吞吐. 缺点:比较明显,后期数据运维与迁移比较困难.好在Mycat有对应的解决方案,具体后期验证或可直接参考Mycat权威指南相应章节. 2 环境说明 参考  <MyCat 学习笔记>第六篇.数据分片 之 按月数据分片  http://www.cnblogs.com/kaye0110/p/5160826.html 3 参数配置 3.1 server.xm

Accelerated C++学习笔记5—&lt;组织程序和数据&gt;

第4章  组织程序和数据 从前面的学习中,我们可以发现程序并不是我们所想的那么简短,他们都有一个共同的特性,那就是 1)都能解决某些特定类型的问题 2)与其他的大多数工具都互相独立 3)都具有一个自己的名称 C++中提供两种基本的方法来让我们组织大型的程序,函数(子程序)和数据结构. 1.组织计算 1)计算总成绩 子函数grade <span style="font-family:KaiTi_GB2312;">//根据学生的期中考试.期末考试.家庭作业成绩来计算总成绩 do

Swift学习笔记(5)--数组

数组的下标从0开始计数,相关方法属性涉及到下标时也从0开始计数 1.定义: //1.可变数组 var cityArray = ["Portland","San Francisco","Cupertino"] //2.不可变数组 let cityArray2 = ["Portland","San Francisco","Beijing"] //3.空数组 var animalArray =