我即将开始首次使用Core Data,并且我试图确保我的数据模型在我进入太远并且意识到它没有之前是不错的。我在SQL方面经验丰富并且假设(错误地看来)Core Data是一个不同名称的SQLite。我已经读过,新手们对核心数据项目的一大失败是他们试图将RBMS概念应用到核心数据中,这不一定是最好的方法。我已经模拟了我想在这个测试项目中使用的一个小模式。但不确定如何更改它以更适合核心数据?所以,如果有人能为我的情景提供一些很好的指示
答案 0 :(得分:1)
忘记持久性(将其放在磁盘上)。您将如何在内存数据结构中对此进行建模?这通常与您在Core Data中对其进行建模的方式非常接近。 Core Data是一个对象图持久性引擎。如果您的对象图形小到足以适合内存,原则上您根本不需要核心数据(这不完全正确; Core Data有一些其他功能,但允许您有效地处理大规模对象图是标题之一。
核心数据存在一些差异,例如每个需要反向的关系(因此如果球员有球队关系,那么球队应该有球员关系)。但基本上,按照您对物体进行建模的方式对其进行建模,因为它们就是这样。
所以我并不完全理解你的某些模特,但是一个通用的"玩家在团队中,团队有游戏和游戏在一个赛季,"我想象一下(简化)模型沿着这些方向:
class Player: NSManagedObject {
@NSManaged var name: String
@NSManaged var team: Team? // 0..1 relationship
}
class Team: NSManagedObject {
@NSManaged var name: String
@NSManaged var players: Set<Player> // 0..*
@NSManaged var homeGames: Set<Game> // Inverse for homeTeam (See more below)
@NSManaged var awayGames: Set<Game> // Inverse for awayTeam
// There are more powerful and efficient ways to do this, but a simple convenience example
var games: Set<Game> { return homeGames + awayGames }
}
class Game: NSManagedObject {
@NSManaged var homeTeam: Team
@NSManaged var awayTeam: Team
@NSManaged var season: Season
@NSManaged var date: NSDate
}
class Season: NSManagedObject {
@NSManaged var name: String
@NSManaged var games: Set<Game> // Note again the inverse relationship
}
我把它变成了家庭团队/远程团队,因此很容易强制执行两个团队。但你也可以这样做:
class Team: NSManagedObject {
@NSManaged var name: String
@NSManaged var players: Set<Player> // 0..*
@NSManaged var games: Set<Game> // Many to many relationship
}
class Game: NSManagedObject {
@NSManaged var teams: Set<Team> // Many to many relationship
@NSManaged var season: Season
@NSManaged var date: NSDate
}
您必须在Core Data中创建中间体,这对于多对多的关系来说并不是一件神奇的事情。他们只是对很多人而言#34;对于许多人来说,倒数的关系也很多。&#34;不需要钥匙或任何钥匙。它只是对象。这就是你对Core Data的看法。
(我已经以一种希望有意义的形式写出来,即使它在Xcode 7.3中不是绝对合法的。关系的类型将是一个无类型的NSSet
。这都是在Xcode 8和iOS 10中得到了极大的改进,你得到了很强的类型,但我还没有做足够的工作来确定这是否与语法完全相同。)