ios - 了解 iOS Swift 中的 CoreData

标签 ios swift core-data realm data-modeling

我目前正在构建一个应用程序,并试图理解 CoreData 的概念。我根据此链接的建议为应用程序创建了一个数据模型...

Apple "Define Your Data Model" Link

目前,我只是在本地使用一些测试数据用于开发目的。这是我创建的示例对象类...

import UIKit

func ==(lhs: Recipe, rhs: Recipe) -> Bool {
    return lhs.hashValue == rhs.hashValue
}

class Recipe: Hashable {

dynamic var ID : Int = 0
dynamic var recipeName: String = ""
dynamic var recipeDescription:String = ""
dynamic var servings: Int = 0
dynamic var cookTime: Double = 0.0
dynamic var image: String? = ""

var hashValue : Int {
    get {
        return "\(self.ID)".hashValue
    }
}
init?(id: Int, name: String, description: String, servings: Int, cooktime: Double, image: String) {
    self.ID = id
    self.recipeName = name
    self.recipeDescription = description
    self.servings = servings
    self.cookTime = cooktime
    self.image = image

    if id < 0 || name.isEmpty || description.isEmpty || cookTime < 0 || servings < 0 {
        return nil
    }
}
}

然后,我在本地初始化了其中一些对象,以便在开发期间使用,并且它们工作正常。

我的问题是...

当需要使用像 CoreData 或 RealmSwift 这样的存储时,这种类型的数据模型会变得无关紧要吗?我会创建一个全新的数据模型(例如在 Realm 中)吗?或者这种类型的数据模型能否与其中一种数据库模型很好地配合?

最重要的是,现在像这样构建我的数据模型并在之后合并 CoreData 或 RealmSwift 会导致大量代码重构吗?如果是这种情况,那么是否建议放弃前端开发并在继续之前构建整个数据模型?

最佳答案

Core Data 和 Realm 采用两种截然不同的方法来定义架构。

对于 Core Data,您需要在 Xcode 的数据模型编辑器中设计模型,该编辑器会为每个版本创建一组 xcdatamodel 文件。 然后,您可以使用 Xcode 内置功能或某些第三方工具,如 mogenerator生成您的 NSManagedObject 实体类。 Core Data 可以使用 lightweight migrations 自动推断不同版本架构之间的映射。 ,但这仅在某些限制下有效。如果您的迁移案例应该更复杂,您可以定义自定义映射模型。

使用一般的 Realm 和具体的 RealmSwift,您可以完全在代码中定义您的架构(和迁移)。您的类必须继承自 Object 并且您必须定义您的属性 conforming to some rules ,以便正确识别并自动持久化。

但是,选择一种持久性框架而不是另一种持久性框架的决定将会对应用程序范围产生影响。例如,Core Data 和 Realm 对于多线程有不同的要求。虽然理论上可以避免这种情况,如果您完全封装持久层并仅与前端共享代理对象,您将同时失去组件支持的优势(NSFetchedResultsController/RBQFetchedResultsController)并且持久性框架可以提供更多便利。 (例如更改通知、自动更新……)

关于ios - 了解 iOS Swift 中的 CoreData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36107840/

相关文章:

ios - 如何在我的 iOS 应用程序中调试 carthage(自有)依赖项?

ios - 推送通知,测试更新xcode 7.0.1后生产环境问题

iphone - 如何在UIView中处理背景图片方向

ios - SwiftUI:无法向下拖动来关闭 UIImagePickerController

Swift 4.1 可编码采用数组到键 = 值(键包含一个值)

ios - 我可以在 "for in"控制结构中使用 Swift 向下转换吗?

swift - 在 UIPageControl 旁边的 UILabel 上点击手势不起作用

swift - 使用 Core Data 存储大型字典数组

iphone - 核心数据获取结果 Controller 和自定义节标题

ios - 用于存储日期的 CoreData 推荐做法