领域中的嵌套对象

时间:2016-02-11 21:48:38

标签: swift swift2 realm

问题:
在领域中使用嵌套对象的正确方法是什么?

任务:
我有一个名为目标的模型,例如“减肥”和称为“条纹”的模型,例如你本周检查的频率。

这个想法是用户专注于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.这个任务甚至是必需的列表吗?

为初学者问题道歉。赞赏,马特。

1 个答案:

答案 0 :(得分:2)

goal类的Streak引用需要定义为:

动态变量目标:目标? //一对一的关系必须是可选的

然后你可以向Realm添加一个条纹实例,它会自动将它链接到正确的目标。

此外,他们不建议将两个引用保持在多对多关系中(即父对子和子对父),因为它很容易出错,因为Realm不管理它您。因此,我只存储子到父引用,并使用linkingObjects(_:forProperty:)动态检索父对子链接。但是,这样做的缺点是您无法在谓词中使用链接。

您根本不需要主键才能使用此功能。因此,如果您有一系列条纹,您可以使用:

try! realm.write {
    realm.add(streaks)
}

请注意,您必须在子项(streak)之前将父(目标)添加到Realm。