Swift实现CoreData存储数据
之前写过一篇介绍iOS数据存储方法的文章,包含:FMDB,SQLite3 ,Core Data,Plist,偏好设置,归档。 链接:www.jianshu.com/p/e88880be7…
本文则是介绍Swift中CoreData的基本使用。
文中示例代码GitHub地址:Demo
目录
一、 图形化创建模型
二、 手动创建模型并实现AppDelegate中的代码
三、 创建并实现CoreDataManager
一、图形化创建模型(这一小节的内容我的另一篇文中也有,如已经熟悉,或想要直接手动创建模型,可以直接看第二小节正式进入Swift)
创建项目的时候,勾选下图中的Use Core Data选项,工程中会自动创建一个数据模型文件。当然,你也可以在开发中自己手动创建。
下图就是自动创建出来的文件
如果没有勾选,也可以在这里手动创建。
点击Add Entity之后,相当一张数据表。表的名称自己在上方定义,注意首字母要大写。 在界面中还可以为数据实体添加属性和关联属性。
Core Data属性支持的数据类型如下
编译之后,Xcode会自动生成Person的实体代码文件,并且文件不会显示在工程中,如果下图中右侧Codegen选择Manual/None,则Xcode就不会自动生成代码,我们可以自己手动生成。
- 手动生成实体类代码,选中CoreDataTest.xcdatamodeld文件,然后在Mac菜单栏中选择Editor,如下图所示。一路Next就可以了。
- 如果没有选择Manual/None,依然进行手动创建的话,则会与系统自动创建的文件发生冲突,这点需要注意。
- 你也可以不要选择Manual/None,直接使用系统创建好的NSManagedObject,同样会有4个文件,只是在工程中是看不到的。
Swift中手动创建出来的是这样2个文件
还要注意编程语言的选择,Swift或OC
二、手动创建模型并实现AppDelegate中的代码
讲道理,这一节应该是Core Data堆栈的介绍与使用,不过由于之前的文章中已经有了,这里就不啰嗦了,我们直接上图和代码。
如下图所示,创建模型,我这里直接创建一个命名为Model的模型。
创建Person表,两个属性name和age,注意右侧的
Codegen
我们这里选择Class Definition
,然后直接Command+B编译代码,Xcode会自动帮我们生成Person+CoreDataClass.swift
和Person+CoreDataProperties.swift
文件
- 配置AppDelegate中的代码,首先导入CoreData头文件,然后懒加载
NSManagedObjectModel
注意modelURL中填写的是模型文件的名字,并且后缀填写
momd
import CoreDatalazy var managedObjectModel: NSManagedObjectModel = {let modelURL = Bundle.main.url(forResource: "Model", withExtension: "momd")let managedObjectModel = NSManagedObjectModel.init(contentsOf: modelURL!)return managedObjectModel!}()
复制代码
- 懒加载持久化存储协调器
NSPersistentStoreCoordinator
sqliteURL
是sqlite文件的路径documentDir
是后面加载好了的Document路径
lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = {let persistentStoreCoordinator = NSPersistentStoreCoordinator.init(managedObjectModel: managedObjectModel)let sqliteURL = documentDir.appendingPathComponent("Model.sqlite")let options = [NSMigratePersistentStoresAutomaticallyOption : true, NSInferMappingModelAutomaticallyOption : true]var failureReason = "There was an error creating or loading the application's saved data."do {try persistentStoreCoordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: sqliteURL, options: options)} catch {// Report any error we got.var dict = [String: Any]()dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data" as Any?dict[NSLocalizedFailureReasonErrorKey] = failureReason as Any?dict[NSUnderlyingErrorKey] = error as NSErrorlet wrappedError = NSError(domain: "YOUR_ERROR_DOMAIN", code: 6666, userInfo: dict)print("Unresolved error \(wrappedError), \(wrappedError.userInfo)")abort()}return persistentStoreCoordinator}()lazy var documentDir: URL = {let documentDir = FileManager.default.urls(for: FileManager.SearchPathDirectory.documentDirectory, in: FileManager.SearchPathDomainMask.userDomainMask).firstreturn documentDir!}()
复制代码
- 懒加载
NSManagedObjectContext
lazy var context: NSManagedObjectContext = {let context = NSManagedObjectContext.init(concurrencyType: NSManagedObjectContextConcurrencyType.mainQueueConcurrencyType)context.persistentStoreCoordinator = persistentStoreCoordinatorreturn context}()
复制代码
三、创建并实现CoreDataManager
我一般是把数据存储方法封装到一个CoreDataManager中,这样在以后的使用中比较方便。当然,你也可以根据自己的需求灵活运用。
创建一个继承自
NSObject
的CoreDataManager.swfit
文件,并且import CoreData
实现
CoreDataManager
的单例,并且拿到AppDelegate中刚才懒加载的NSManagedObjectContext
swift中创建单例比较方便,直接
static let shared = CoreDataManager()
// 单例static let shared = CoreDataManager()// 拿到AppDelegate中创建好了的NSManagedObjectContextlazy var context: NSManagedObjectContext = {let context = ((UIApplication.shared.delegate) as! AppDelegate).contextreturn context}()
复制代码
- 实现更新数据的方法
除了查询数据,其余对数据进行增删改的时候,都别忘记调用这个方法,只有这个方法执行ok,才算增删改完成。
// 更新数据private func saveContext() {do {try context.save()} catch {let nserror = error as NSErrorfatalError("Unresolved error \(nserror), \(nserror.userInfo)")}}
复制代码
- 增加数据(保存数据)
- 首先运用
NSEntityDescription
创建出person
- 然后为
person
赋值,最终调用saveContext()
方法保存数据
// 增加数据func savePersonWith(name: String, age: Int16) {let person = NSEntityDescription.insertNewObject(forEntityName: "Person", into: context) as! Personperson.name = nameperson.age = agesaveContext()}
复制代码
- 获取所有数据
- 如果是通过系统自动生成的CoreData文件,
Person
会自带一个fetchRequest()
的方法,我们可以直接通过Person.fetchRequest()
的方式拿到person
的NSFetchRequest
对象- 然后通过
context
的fetch(fetchRequest)
方法拿到数据数组
// 获取所有数据func getAllPerson() -> [Person] {let fetchRequest: NSFetchRequest = Person.fetchRequest()do {let result = try context.fetch(fetchRequest)return result} catch {fatalError();}}
复制代码
- 获取特定条件的数据
- 可以利用
NSPredicate
来过滤出符合一定条件的数据- 而
NSFetchRequest
中有predicate
这样一个属性
// 根据姓名获取数据func getPersonWith(name: String) -> [Person] {let fetchRequest: NSFetchRequest = Person.fetchRequest()fetchRequest.predicate = NSPredicate(format: "name == %@", name)do {let result: [Person] = try context.fetch(fetchRequest)return result} catch {fatalError();}}
复制代码
- 修改数据
- 首先获取到想要修改的数据
- 然后循环修改就可以了
- 最后别忘记
save
// 根据姓名修改数据func changePersonWith(name: String, newName: String, newAge: Int16) {let fetchRequest: NSFetchRequest = Person.fetchRequest()fetchRequest.predicate = NSPredicate(format: "name == %@", name)do {// 拿到符合条件的所有数据let result = try context.fetch(fetchRequest)for person in result {// 循环修改person.name = newNameperson.age = newAge}} catch {fatalError();}saveContext()}
复制代码
- 根据条件删除数据
- 与修改数据一样,首先拿到符合删除条件的数据
- 循环调用
context
的delete()
方法就可以了- 最后别忘记
save
// 根据姓名删除数据func deleteWith(name: String) {let fetchRequest: NSFetchRequest = Person.fetchRequest()fetchRequest.predicate = NSPredicate(format: "name == %@", name)do {let result = try context.fetch(fetchRequest)for person in result {context.delete(person)}} catch {fatalError();}saveContext()}
复制代码
- 删除所有数据
- 获取所有数据
- 循环删除
save
// 删除所有数据func deleteAllPerson() {// 这里直接调用上面获取所有数据的方法let result = getAllPerson()// 循环删除所有数据for person in result {context.delete(person)}saveContext()}
复制代码
后记
本文运用一个简单的示例来说明swift中如何使用CoreData
,更多用法或注意事项就不一一列举了。
本文Demo:github.com/remember17/…
作者GitHub:github.com/remember17
Swift实现CoreData存储数据相关推荐
- Swift实践:使用CoreData存储多种数据类的通讯录
上一篇文章简单的实现了一个通讯录,说是通讯录实际上就只是一个简简单单的Name List.这次我们要往这个通讯录里面加入更多的元素,目的也是为了学习CoreData如何存储更多的数据类型. 完成后的效 ...
- IOS之Swift的CoreData入门使用案例
IOS之Swift的CoreData入门使用案例 CoreData和SQLite3类似,用来把数据存在磁盘上的.可以随时读写. 创建项目钩上 当APP退出的时候,数据消失. 使用CoreData,退出 ...
- 2021年大数据HBase(十三):HBase读取和存储数据的流程
全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 HBase读取和存储数据的流程 一.HBase读取数据的流程 ...
- .pgr照片文件解析,C++与Java存储数据差别大小端模式
一..pgr是什么? .pgr文件是二进制的图像文件,可以用普通的文本文件打开,或者查看十六进制的文本信息: 读取需要了解~~~非常重要 !!! 基本数据类型的大小端存储模式 表头Header 详细信 ...
- string生成固定长度的哈希_Redis 选择Hash还是String 存储数据?
点击上方"Java之间",选择"置顶或者星标" 你关注的就是我关心的! 作者:goodspeed 微信公众号:四月(ID:hiiiapril) 在stackov ...
- 在python中使用json格式存储数据
在python中使用json格式存储数据 代码如下: import jsonlist1 = [{'A': [1, 2, 3, 4, 5, 6], 'B': [3, 4, 5, 6, 7]},{'C': ...
- android studio数据库存储数据,如何使用API 23在android studio中的数据库中存储数据?...
大多数时候我不会发布任何内容,因为我可以在其他帖子中找到我需要的所有内容,但是现在我已经有几天了,您如何在数据库中存储任何内容?这是我的Java代码如何使用API 23在android studi ...
- 关于外部存储器件对存储数据的管理。
一引子 :需要大量存储数据时,一般都不会使用单片机内部存储资源(单片机内部的eerom或者flash模拟eeprom只适合存储少量的数据).一般是通过I2C/SPI接口外部扩展eeprom或者flas ...
- 使用嵌入式关系型SQLite数据库存储数据
除了可以使用文件或SharedPreferences存储数据,还可以选择使用SQLite数据库存储数据. 在Android平台上,集成了一个嵌入式关系型数据库-SQLite,SQLite3支持 NUL ...
最新文章
- 开源 | 蚂蚁金服分布式中间件开源第二弹:丰富微服务架构体系
- 2018年04月26日交的智商税
- python爬虫:使用BeautifulSoup进行查找
- 跟我学交换机配置(一)
- Monthly Expense【二分】
- 触发父组件变量_Vue组件之间的传值
- Qt编写自定义控件15-百分比仪表盘
- 第八章、面向对象设计
- python获取豆瓣高分电影写入MYSQL+matplotlib简单可视化
- 腾讯云服务器操作系统TencentOS安装与体验
- java 输出13060个繁体字集的Unicode码
- 从初级到资深:程序员的职业生涯思考与可迁移技能培养
- 给oracle数据库现有表添加字段
- 程序员如何动手打造属于自己的智能…
- java crach 日志解析
- 第十届蓝桥杯C语言B组题解
- erp与相关计算机技术,基于ERP的商务智能系统应用-计算机技术专业论文.docx
- mimikatz常见命令
- 上拉下拉复位SMBus
- Java基础——线程基础
热门文章
- java中optionnull_用 option 代替 null
- c++tcp接收文件缓存多大合适_必知必会的TCP/IP知识
- linux落字效果代码,Shell中实现飞行文字效果
- linux emule 编译 wx-config --libs,linux下编译wxwidgets所写程序所遇到的问题
- CentOS进不了系统
- mysql查询索引like_mysql 索引与优化like查询
- mfc c语言 编辑器,语法高亮编辑控件Scintilla在MFC中的简单使用
- python调用git生成log文件_python解析git log后生成页面显示git更新日志信息
- java公网对讲_【对讲机的那点事】选择公网对讲机你必须要知道使用的网络信号!...
- jQuery成为微软.NET开发工具的一部分了