Swifty CoreData!

CoreData是一个框架,可帮助您管理应用程序中的模型层对象,并且使用起来非常简单,因为可以自动生成一些所需的代码。

可悲的是,由于CoreData是用Objective-C编写的(听起来已经是age),并且在与Swift一起使用时,与此框架相关的问题很少(或者我称之为“限制”)。

在本文中,我将尽可能多地坚持使用CoreData员工,您将找不到创建整个应用程序的任何信息,并且我假设您了解Swift和iOS开发的基础知识。 另外,还有一件事是重要的-尝试将CoreData与您对SQL数据库的想法不同,并且工作原理有所不同。

如果您熟悉CoreData基础知识,并且想知道如何手动生成模型的类,请跳到本文的结尾。

样例项目

我创建了一个示例项目-您可以在GitHub上找到它。

让我们开始吧!

在创建新项目时,您可以选中标记“ 使用核心数据”在您的应用程序中包含一些样板代码-它包含对保存核心数据的支持,并为我们提供了一个持久性容器,可用于将存储加载到我们的应用程序,这将还向项目添加一个空的数据模型文件。 这两种方法都在AppDelegate文件中创建。

打开数据模型文件(扩展名为.xcdatamodeld )后,您将看到编辑器,在其中可以添加实体,实体中的属性,获取请求等。让我们从创建实体开始-命名为Article 。 现在,我们可以为其添加一些属性-我们将使该示例尽可能简单,因此只需创建两个属性,并将它们称为TitleContent 。 现在,我们应该已经配置了模型,如下所示:

由于文章通常应该总是有标题,并且某些内容让我们使它们成为非可选的(尽管请记住,Core Data仍然是Objective-C框架,所以它与您在Swift中所使用的不是相同的可选)–您可以做到通过取消选中右侧实用工具中的可选复选框。

太棒了! 正如我在开始时提到的那样,使用基本配置,我们所有的模型都将自动生成为类,因此我们现在要做的只是开始从Core Data模型中保存和获取数据。

保存

我们必须先用一些数据填充模型-在视图控制器中创建一个函数

我在这里创建了对AppDelegate的引用,因为我们将需要使用它来将文章保存在商店中。

  1. 与主队列关联的管理对象上下文。 它是NSManagedObjectContext类型的对象。
  2. 由于我们的实体是自动生成的,因此我们可以轻松地在代码中创建其对象。
  3. 我们在文章中填充一些随机的标题和内容(您可以在示例项目中找到randomString函数,这只是iAhmed在StackOverflow上的粘贴复制答案)。
  4. AppDelegate轻松调用saveContext方法,将我们的更改保存在上下文中。

那很简单,不是吗?

正在取得

但是……它真的被保存了吗? 让我们获取这些文章,并在我们的商店中检查它们是否应该放置在应有的位置。 提取有点复杂……只是在开玩笑,它需要几行代码,但是完成一些基本的提取不会花费几分钟。 如果在诸如AppDelegate之类尚未导入的文件中导入CoreData框架,请不要忘记导入它。

  1. 创建一个提取请求。 由于代码是自动生成的,因此我们可以轻松地调用扩展程序的函数来为我们创建请求-它返回NSFetchRequest
    (entityName: „Article”)
  2. 您可以配置您的请求-我不会过多介绍细节,但除其他外,您还可以创建一个谓词,该谓词仅获取具有给定先决条件的对象。
  3. 从上下文的存储中获取所有对象(在本例中为文章)。 由于它是通用方法,并且将我们的请求作为参数,因此结果将转换为适当的对象。
  4. 循环浏览所有获取的文章并打印其标题。

删除中

从商店中删除对象与上述操作一样容易。 我们要做的就是创建/获取要删除的对象,然后在上下文中调用delete,将要删除的对象作为参数。

  1. 使用先前的功能加载文章( NSManagedObject的对象)。
  2. 循环浏览文章并将其删除。

下一步是什么?

自动并不意味着更好,所以让我们手动编写模型,以便可以利用可选值(谁知道,也许有一天会考虑可选值来生成它)。 返回数据模型的编辑器,然后在“实用程序”的“类”部分下,将Codegen更改为Manual/None

一旦完成,项目将不再编译,因此我们要做的就是创建我们自己的Article类。

  1. 由于CoreData是Objective-C框架,因此我们必须使我们的类在Objective-C和Objective-C运行时中可用。
  2. 将类命名为与在数据模型编辑器中命名的类相同的类,并从NSManagedObject继承。
  3. 添加属性以匹配模型中的属性-在这里我们可以添加一些不错的东西。 我没有在我的示例项目中这样做,但是。 我们可以创建自己的类型和别名,并在此处使用它们,也可以添加模型中未提及的一些额外属性,以便临时存储它们。
  4. 使用fetchRequest方法进行扩展以使其与以前的实现兼容,并且……很好……这不是创建获取请求的好方法吗?

自己编写模型有一个巨大的优势-您可以为任何属性创建别名或包装,以使其他人更容易理解模型(如果您想让我写更多的内容,请在下面的评论中告诉我)。

自动生成的类和扩展存储在DerivedData目录中,因此实际上很难在一群人之间维护它们-每次有人更改模型中的某些内容时,团队中的每个人都必须重新生成它们(即,首先清除DerivedData )。 手动类也有类似的问题-必须手动使它们与模型同步,但就个人而言,我希望控件中包含所有内容。

就这些

如果您有任何疑问,可以通过电子邮件,Twitter与我联系,在GitHub上创建问题,或在下面below发表评论

感谢您的阅读。

通讯

您想听我更多吗? 不要跳过任何文章-订阅新闻通讯。