web-dev-qa-db-ja.com

複合主キーレルム/ Swift

私はSwiftとレルムに不慣れです。複合主キーを作成したいのですが、次のようなことを試みているとき:

class DbLocation : Object {
 dynamic var id = 0
 dynamic var tourId = 0

 dynamic var uuid : String  {
    return "\(id)\(tourId)"
 }

 override static func primaryKey() -> String? {
    return "uuid"
 }
}

このエラーが発生します:「プライマリキープロパティ「uuid」がオブジェクト「DbLocation」に存在しません

誰でも私に複合主キーを作成する方法の例を手伝ってくれる?

26
halfred

これはあなたに答えを与えるはずです:

class DbLocation: Object {
    dynamic var id = 0
    dynamic var tourId = 0

    func setCompoundID(id: Int) {
        self.id = id
        compoundKey = compoundKeyValue()
    }

    func setCompoundTourId(tourId: Int) {
        self.tourId = tourId
        compoundKey = compoundKeyValue()
    }

    dynamic lazy var compoundKey: String = self.compoundKeyValue()

    override static func primaryKey() -> String? {
        return "compoundKey"
    }

    func compoundKeyValue() -> String {
        return "\(id)\(tourId)"
    }
}

カスタムセッターは、compoundKeyが常に更新されていることを確認します。遅延キーWordは、初めてアクセスしたときに、既に設定した内容から派生することを確認します。

この問題については、この問題について議論されている this thread で詳しく説明しています。

25
Michal

複合主キーであると予想される他の興味のあるプロパティに値が設定されている新しいプロパティを作成します。

class DbLocation: Object {
            dynamic var id = 0
            dynamic var tourId = 0
            dynamic var compoundKey: String? = ""

        override static func primaryKey() -> String? {
                return "compoundKey"
            }
        }
    let location = DbLocation()
    location.tourId = 1
    location.id = 5
    location.compoundKey = "\(id) \(tourId)"
1

SwiftおよびRealmの最新バージョンの場合、私はこのようなことをします。

dynamic private var compoundKey: String = ""

required convenience init?(map: Map) {
  self.init()
  if let firstValue = map.JSON["firstValue"] as? String,
    let secondValue = map.JSON["secondValue"] as? Int {
    compoundKey = firstValue + "|someStringToDistinguish|" + "\(secondValue)"
  }
}
0
ZeroOne