问题:
在领域中使用嵌套对象的正确方法是什么?
任务:
我有一个名为目标的模型,例如“减肥”和称为“条纹”的模型,例如你本周检查的频率。
这个想法是用户专注于1x'Streak'的目标,最后,他们可以开始新的连胜。因此,我希望有多条条纹都与一个目标有关。
以下是我到目前为止的模型:
条纹模型
import Foundation
import RealmSwift
class Streak: Object {
dynamic var owner: Goal!
dynamic var StartDate = NSDate()
dynamic var Day1 = ""
dynamic var Day2 = ""
dynamic var Day3 = ""
dynamic var Day4 = ""
dynamic var Day5 = ""
dynamic var Day6 = ""
dynamic var Day7 = ""
dynamic var Completed = ""
dynamic var Active = ""
// Specify properties to ignore (Realm won't persist these)
// override static func ignoredProperties() -> [String] {
// return []
// }
}
目标模型
class Goal: Object {
dynamic var id = 0
dynamic var Title = ""
dynamic var Aim = ""
dynamic var Action = ""
dynamic var Active = 0
let streaks = List<Streak>()
override class func primaryKey() -> String! {
return "id"
}
// Specify properties to ignore (Realm won't persist these)
// override static func ignoredProperties() -> [String] {
// return []
// }
}
如您所见,我已将streak
的“所有者”设为Goal!
。我还在目标中的id
上创建了一个主键,并在目标模型中创建了streaks
列表。
我不明白的是如何在领域中正确存储streak
。
要存储目标,我有:
let goalObj = Goal()
goalObj.id = newID
goalObj.Title = setGoal.text!
goalObj.Aim = ""
goalObj.Action = setHabit.text!
goalObj.Active = 1
// goalObj.streaks = [NSDate(),"1","1","1","1","1","1","1","1","1"]
let realm = try! Realm()
try! realm.write {
realm.add(goalObj)
我评论了goalObj.streaks行,因为它不正确并且给出了错误(值都是假的)。
我的具体问题是:
1.如何存储引用目标的条纹对象 - 如果有的话,我在哪里放置ID
2.如何最好地更新连胜。我应该创建一个streakID字段作为主键吗?我没有看到像在MySql中那样使用外键的方法。
3.这个任务甚至是必需的列表吗?
为初学者问题道歉。赞赏,马特。
答案 0 :(得分:2)
goal
类的Streak
引用需要定义为:
动态变量目标:目标? //一对一的关系必须是可选的
然后你可以向Realm添加一个条纹实例,它会自动将它链接到正确的目标。
此外,他们不建议将两个引用保持在多对多关系中(即父对子和子对父),因为它很容易出错,因为Realm不管理它您。因此,我只存储子到父引用,并使用linkingObjects(_:forProperty:)
动态检索父对子链接。但是,这样做的缺点是您无法在谓词中使用链接。
您根本不需要主键才能使用此功能。因此,如果您有一系列条纹,您可以使用:
try! realm.write {
realm.add(streaks)
}
请注意,您必须在子项(streak)之前将父(目标)添加到Realm。