Core Data 是一个强大的框架,用于管理 iOS 和 macOS 应用程序的数据模型。它可以帮助开发者快速地创建和维护数据库,并且可以轻松地将数据存储在本地文件中。Core Data 提供了一个面向对象的方法来管理数据,使得开发者可以快速而有效地处理大量的数据。
Core Data 的核心是一个关系型数据库,它使用 SQLite 作为存储引擎。它允许开发者将多个表格连接起来,并使用 SQL 语句来执行复杂的数据库查询。此外,Core Data 还包含一些高级功能,如对象图形映射 (Object Graph Mapping)、内存管理 (Memory Management) 和性能优化 (Performance Optimization) 等。
// 创建 Core Data Stack let persistentContainer = NSPersistentContainer(name: "MyDataModel") persistentContainer.loadPersistentStores { (description, error) in if let error = error { fatalError("Unresolved error \(error)") } } // 获取上下文对象 let context = persistentContainer.viewContext // 创建新的实体对象 let newEntity = NSEntityDescription.insertNewObject(forEntityName: "MyEntity", into: context) as! MyEntity // MyEntity 是你创建的实体名称 // 这里你可以保存新创建的实体对象 try context.save() // 查询所有实体对象 let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "MyEntity") do { let results = try context.fetch(fetchRequest) for result in results as! [NSManagedObject] { print("result: \(result)") } } catch { print("Error fetching data") }
原文出处: http://chengway.in/post/ji-zhu/core-data-by-tutorials-bi-ji
最近花了半个月读完了Raywenderlich家的《Core Data by Tutorials》,接下来几天就做个回顾,笔记并不是对原书的简单翻译,算是对整个知识脉络的一个整理的过程吧:)
Update: 上周去搞Sketch了,工具算是基本入门了,抄了几个图标,画了几个图,以后会再聊聊。好了,进入正题吧,今天打算介绍前三章,也是CoreData的最基础的部分。***
第一章比较简单,主要是带你熟悉CoreData的用法,并用CoreData创建了一个简单的List APP,学完这章你能加满如下技能点:
第一章按顺序大致如下:
作者提供了一个Start Project,打开其实就是一个UITableViewController,你需要做的就是增加一个addName方法,这里使用了UIAlertController这个iOS 8新添加的方法来做数据的添加逻辑,使用起来也很优雅。
这个主要是根据你的数据模型创建对应的managed object model,主要操作也在.xcdatamodeld中进行,全GUI操作,没什么难度。
You can think of a Core Data entity as a class “definition” and the managed object as an instance of that class.
这里作者用了面向对象的思想做了类比,虽然不是很准确,但也方便初学者理解。
这里要注意到NSManagedObject的“对象”其实是遵循“KVC”的,NSManagedObject对象的值改变后,在ManagedContext中进行save操作。
创建一个NSFetchRequest对象,设置好各种条件,依旧是交给ManagedContext对象去执行。下面是作者描述了两种fetch失败的情况
If there are no objects that match the fetch request’s criteria, the method returns an optional value containing an empty array.
If an error occurred during the fetch, the method returns an optional value that contains nil. If this happens, you can inspect the NSError and respond appropriately.
第一章到此结束:)
NSManagedObject上一章我们提到过,要存取属性,只能用KVC,使用起来既不安全也不符合面向对象的原则,所以我们这章要生成他的子类,来创建我们自己的属性,这样就又能愉快地使用"."语法啦。
第二章的大致顺序如下:
作者提供了一个“挑选领结”的Start Project,领结数据存放在plist文件中,同样是一个很简单的App。
打开xcdatamodeld文件进行编辑,添加属性。这里主要看一下Binary Data与Transformable两种类型:
Binary Data这里将image对象保存成了二进制文件,当然任何可以序列化的对象其实都可以保存成二进制。这里作者强调了性能问题,如果将一个很大的二进制保存到SQLite数据库中很可能会产生卡顿等问题。当然,幸运的是Core Data提供了一种叫Allows External Storage的解决方式,他只对binary data的属性类型有效,你只需要简单的开启他就好了。
When you enable Allows External Storage, Core Data heuristically decides on a per-value basis if it should save the data directly in the database or store a URI that points to a separate file.
在Xcode中选择EditorCreate NSManagedObject Subclass创建managedObject对象的子类,这里注意下Map Model中的attribute type与实际子类对象中的属性的对应关系就好了
当然如果你想保留Map Model中的原始基本类型,那么在创建NSManagedObject Subclass时要勾选Use scalar properties for primitive data types
Similar to @dynamic in Objective-C, the @NSManaged attribute informs the Swift compiler that the backing store and implementation of a property will be provided at runtime instead of at compile time.
这里注意下两种语言的一点区别
创建完子类还要记得一点就是在Model中的Attributes inspector将class name设为你新生成的子类路径,完成这一步主要是为了在runtime时将managed object subclass与Model中的entity链接起来。(有点类似与在SB中创建一个VC,并设置他的custom class)。
因为Xcode默认的CoreData模板会将context在AppDelegate中创建,所以,就会有这种获取context的做法:
let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
但这种做法还是不推荐使用,较好的方法是能够在对象的的初始化中将context作为参数进行传递。
接下来,作者从plist中将数据通过子类对象导入到core data中,再对界面做了些操作,这都比较简单。
数据校验这里可以在data model inspector 中设置最大最小值,如果出错会在context save的时候将错误信息传给error参数
第二章到此结束:)
Core Data要正常运行,需要几个组件共同协作来完成,这些组件包括:
这些组件共同构成了Core Data Stack,组件间的关系我觉得用苹果官方提供的一张图来展示最好不过了
matplotlib是基于Python的绘图库,广泛用于Python科学计算界。它完整支持二维绘图以及部分支持三维绘图。该绘图库致力于能适应广...
jQuery hasClass() 方法jQuery HTML/CSS 方法实例 检查 p 元素是否包含 intro 类:$(button).click(function(){ alert($(p).hasC...
jQuery offsetParent() 方法jQuery 遍历方法实例 设置 p 元素的最近的被定位的父元素的背景颜色:$(button).click(function(){ $...
jQuery event.isDefaultPrevented() 方法jQuery 事件方法实例 防止链接打开 URL,并检查 preventDefault() 是否被调用:$(a).cli...
jQuery after() 方法jQuery HTML/CSS 方法实例 在每个 p 元素后插入内容:$(button).click(function(){ $(p).after(pHello world...