从核心数据开始!简单的话很难

Core Data已经编写了很多主题,但是这些文章大多数都是英文的,并且使用了很多“智能”字眼,可能会使初学者感到困惑。

在本文中,我将尝试以一种易于理解的语言从Apple讨论此框架,以便即使是“最小”的程序员也可以自己获取信息,并获得最少的知识,这将对他们的项目有所帮助。

小题外话


核心数据是一个非常强大的工具,可让您将数据保存在应用程序中并在以后使用。在本文中,我不会谈论在后续的同步中使用多个上下文,如何解决迁移问题以及各种高级功能。

本文的目标读者是通常没有使用Core Data的经验的人。

好吧...让我们开始吧!


首先,您需要创建.xcdatamodeld文件本身,将其打开后,在屏幕底部,您将看到“添加实体”按钮。通过单击它,将创建您的对象模型:



现在,更详细地:

  1. 您的实体。您可以将Entity视为数据结构,它继承自某个类NSManagedObject,并且还将具有某些用于写入数据的字段,稍后将对此进行介绍。
  2. Attributes. Entity . + . :
    • Integer 16/32/64 — . , . Int, .
      : Integer16(15)
    • Decimal/Double/Float — . , .
    • String — .
    • Boolean — .
    • Date — Date.
      NOTE: Core Data 00:00:00 UTC 1 1970 .
    • Binary Data — Data
      NOTE: Allow External Storage. Core Data , 100 , Core Data . .
    • UUID — UUID.
    • URI — URL
    • Transformable — , NSCoding.

  3. Relationship. Entity. Relationships :

    1. One-to-One
    2. One-to-Many
    3. Many-to-Many

    Relationships.

    3 Entities, Andrey, Home, Car.

    • — One-to-One Relationship.
    • 1, 2 — One-to-Many Relationship.
    • Many-to-Many Relationship . .
  4. Entity
  5. Codegen字段。简而言之,此字段指示谁来管理NSManagedObject类的创建。为了便于操作,请选择Manual / None,然后Core Data将能够为您的实体本身创建必要的类。关于它下面。

要创建我们的Entity类,请使用:

编辑器>创建NSManagedObject子类。



如果要为属性设置默认值,请使用以下方法:

public override func awakeFromInsert() {
        super.awakeFromInsert()
        date = Date()
}

使用NSManagedObjectContext和PersistentStoreCoordinator


核心数据堆栈层次结构:



简单来说,所有实体在上图中都显示为“托管对象”。我们所有的托管对象都存储在NSManagedObjectContext中。上下文它是指NSPersistentStoreCoordinator,它在访问SQL后将保存的数据存储为行缓存,但是现在不是这种情况。

要创建ManagedObject(实体)的实例,必须引用NSPersistentContainer,它是NSPersistentStoreCoordinator的包装。

var persistentContainer: NSPersistentContainer = {
      let container = NSPersistentContainer(name: "SavingLearn")
      container.loadPersistentStores(completionHandler: { (storeDescription, error) in
          if let error = error as NSError? {
              fatalError("Unresolved error \(error), \(error.userInfo)")
          }
      })
      return container
  }()

接下来,我们需要通过PersistentContainer访问NSManagedObjectContext:

var context: NSManagedObjectContext = {
    return persistentContainer.viewContext
  }()

现在,我们可以从上下文中创建ManageObject的实例并为其分配值:

var person = Person(context: context)
person.age = 32

保存对象


为了保存,我们使用一个简单的函数:

func saveContext () {
      if context.hasChanges {
          do {
              try context.save()
          } catch {
            context.rollback()
              let nserror = error as NSError
              fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
          }
      }
  }

在上面的方法中,我们检查上下文是否有更改,如果有更改,则进行保存。如果发生错误,则执行该方法:

context.rollback()

rollback()
该方法将上下文返回到其原始状态,并取消对其进行的所有更改。

删除物件

context.delete(object)

使我们能够轻松地从Core Data中删除对象。
注意:为了使更改生效,必须保存上下文,否则将不保存所有更改。
context.save()

检索所有对象


为了从Core Data获取我们的对象数组,我们必须执行NSFetchRequest。因为本文是为初学者设计的,所以我不会深入研究FetchRequest的全部功能。

let fetchRequest: NSFetchRequest<Person> = Person.fetchRequest()
let objects = try context.fetch(fetchRequest)

在后台,NSFetchRequest做得很好:

  1. NSFetchRequest转到持久性存储协调器
  2. 持久性存储协调器将请求发送到持久性存储
  3. Persistent Store SQL
  4. SQL . ID Row Value. Row Value Persistent Store Row Cache ID.
  5. Persistent Store Managed Objects ID Persistent Store Coordinator. fault () . Managed Object Context ID, Core Data SQL.
  6. Persistent Store Coordinator context Managed Object
  7. Core Data .
    includePendingChanges = false
  8. NSManagedObject

注意:当NSFetchRequest受管对象上下文正在运行并且持久性存储协调器在同步队列中运行时,所有进程都将被阻塞,而另一个进程正在运行。

结论


在本文中,我描述了使用Core Data所需的最少信息。

现在,您可以创建自己的数据模型,进行保存,删除和检索。

如果您对使用Core Data的更多“高级”主题和有趣的技巧感兴趣,请在评论中写下,我将找出解决方法。编码愉快!

All Articles