2017-03-04 20 views
6

Alamofire adresinden yanıt aldıktan sonra nesnesini Objectmapper kullanarak nesnesini kaydetmeye çalışıyorum.Bileşik anahtar sorunu Realm Swift

func getTodayData() { 

    Alamofire.request("https://myapipoint.json").responseJSON{ (response) in 

     guard response.result.isSuccess, let value = response.result.value else { 
      return 
     } 
     let json = JSON(value) 


     guard let realm = try? Realm() else { 
      return 
     } 

     realm.beginWrite() 

     for (_, value): (String, JSON) in json { 

      let tpTodayOb = Mapper<TPToday>().map(JSONObject: value.dictionaryObject) 

      realm.add(tpTodayOb!, update: true) 
     } 

     do { 
      try realm.commitWrite() 
     } 
     catch { 
      print("Error") 
     } 
    } 
} 

benim sunucudan json harita verilerinde am güçlü Aşağıda yazdım koddur. Ancak, bileşik anahtarımla ilgili bir sorun var. Üç değişken benzersiz değildir, ancak bunların kombinasyonu benzersizdir, bu yüzden birincil anahtarım olarak compoundKey'u kullanmak zorunda kaldım. Benim üç değişken başlatıldı nerede

public dynamic var compoundKey: String = "0-" 

public override static func primaryKey() -> String? { 
    // compoundKey = self.compoundKeyValue() 
    return "compoundKey" 
} 

private func compoundKeyValue() -> String { 

    return "\(yearNp)-\(mahina)-\(gate)" 
} 

budur: şöyle ben compoundKey den primaryKey inşa ediyorum.

func setCompoundID(yearNp: Int, mahina: String, gate: Int) { 
    self.yearNp = yearNp 
    self.mahina = mahina 
    self.gate = gate 
    compoundKey = compoundKeyValue() 
} 

Ve Github issues uyarınca compoundKey tanımı

burada. Veritabanımda saklanacak 31 sözlük var, ancak sadece son sözlüğü saklayabiliyorum. Bu kod tabanı, birincil veritabanı olarak benzersiz alana sahip başka bir tablodaki verileri depolayabildiğinden, bu bir veritabanı anahtarı sorunu olduğundan emin olabilirim; bu, bu veritabanı tablosunda geçerli değildir. compoundKey numaralı telefonumu yanlış mı söyledim?

cevap

1

Alamofire kullanmamıştım, bu nedenle kodunuzun Alamofire bölümünün doğru olduğunu varsaydım. JSON'unuzun yapısını vermediniz, içeriğe dayanarak, JSON'unuzun 31 sözlük içerdiğini farz ettim. Ayrıca, en baştan varsaydım, Bölge veritabanı boştu. Değilse, lütfen boş bırakın.

Sorunun burada olduğuna inanıyorum.

for (_, value): (String, JSON) in json { 
    let tpTodayOb = Mapper<TPToday>().map(JSONObject: value.dictionaryObject) 

    realm.add(tpTodayOb!, update: true) 
} 

for (_, value): (String, JSON) in json { 
    let tpTodayOb = Mapper<TPToday>().map(JSONObject: value.dictionaryObject) 

    realm.add(tpTodayOb!, update: false) // you don't need `update:true`, unless you want to rewrite it intendedly 
} 

olarak değiştirin ve projeyi çalıştırın. Realm, yinelenen kimlik hatası atarsa, başlatıldıktan sonra compoundKey s öğesinin başarıyla değiştirilmemesi gerekir. O zaman o kısmı kontrol etmelisin. Belki de onu elle aramalı veya init işlevinin ilgili bölümünü geçersiz kılmalısınız.

for (_, value): (String, JSON) in json { 
    let tpTodayOb = Mapper<TPToday>().map(JSONObject: value.dictionaryObject) 
    tpTodayOb.setCompoundID(yearNp: Int, mahina: String, gate: Int) 
    realm.add(tpTodayOb!, update: false) 
} 
İlgili konular