2016-03-19 84 views
0

我正在構建一個應用程序,並試圖讓我的頭腦圍繞着CoreData的概念。我已經創建了一個基於此鏈接中的建議應用程序的數據模型......瞭解iOS中的CoreData Swift

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?如果是這種情況,那麼在繼續前進之前放棄前端開發並構建整個數據模型是可取的?

+0

我不知道Realm,但是通過Core Data,您通常會在Xcode中選擇您的託管對象模型,然後轉到「Editor-> Create managed object subclass」 Xcode爲你創建實體類 – Paulw11

+0

我明白了。那麼當用戶想要在本地存儲一些數據或訪問一些本地數據時,它將通過核心數據而不是上述目標代碼中的初始化程序完成? –

+0

如果您使用的是核心數據,那麼您需要使用NSManagedObject來存儲數據。你可以直接使用'NSManagedObject'並設置/獲取值,但Xcode爲你創建的子類可以讓你說'myRecipe.servings'並將它映射到NSManagedObject。本質上Xcode會創建一個類,與你所顯示的類非常相似,只不過它的子類NSManagedObject,所以它可以被保存到核心數據 – Paulw11

回答

0

Core Data和Realm採用兩種非常不同的方法來定義您的模式。

對於核心數據,您需要在Xcode的數據模型編輯器中設計您的模型,該編輯器會爲每個版本創建一個xcdatamodel文件包。 然後,您可以使用Xcode內置功能或某些第三方工具來生成NSManagedObject實體類。核心數據可以自動推斷出您的架構的不同版本與lightweight migrations之間的映射,但這隻適用於某些限制。如果您的遷移案例應該更復雜,您可以定義自定義映射模型。

Realm通常和RealmSwift專門在這裏,您完全在代碼中定義您的架構(和遷移)。你的課程必須從Object繼承,你必須定義你的屬性conforming to some rules,以便它們被正確識別,並且可以自動持續。

但是,對於一個持久性框架的決定將會對整個應用程序產生影響。例如Core Data和Realm對於多線程有不同的要求。雖然理論上可以避免如果完全封裝持久層並僅與您的前端共享代理對象,那麼您將同時失去組件支持的優勢(NSFetchedResultsController/RBQFetchedResultsController),並且可以爲持久性框架提供更多便利。 (例如更改通知,自動更新...)