2016-11-18 123 views
0

我的主要問題是:

是否有指定的域模型,然後被從新創建的模型時,僅使用默認值的方式,但是,當境界從realm.add(thing, update: true)通話領域添加的對象與更新 - 忽略遺漏值



自動此更新模型的上下文一些信息被忽略...

我,拉人進口商腳本從API獲取數據並將其導入領域。忽略所有的循環和嵌套結構,它是不是初步認識,我基本上有這樣的:

let thing = SomeThing(value: [ 
    "id" : jsonData["id"].int!, 
    "title" : jsonData["title"].string!, 
    "system" : system 
]) 

try! realm.write { 
    realm.add(thing, update: true) 
} 

和我SomeThing模型是這樣的:

class SomeThing : Object { 

    dynamic var id = 0 
    dynamic var title = "" 
    dynamic var system : System? 

    dynamic var favourited = false 

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

favourited布爾不是由API提供,在用戶喜歡該對象時更新。但是,由於模型默認值爲false,當領域發現Thing已存在時,它會更新值並將favourited重置爲false。我知道顯而易見的答案是太拉對象從領域,並自己更新它(如果它存在),所以我可以手動控制什麼得到更新(這是我會做什麼,如果沒有更好的選擇),但有可能是100年甚至1000年的東西,所以我寧願儘量避免首先爲這個問題拉出對象。

回答

2

對於那些有同樣的情況,我發現realm.create設置爲true會做你所需要的更新參數。

在我的問題中使用該方法,領域將相交現有的和新的對象,並更新兩者中存在的任何參數。由於favourited參數是在初始化對象時創建的,因此領域將其視爲一個更改(我已經知道)。

但是,您可以改爲使用realm.create,並只傳入要更改的值。這基本上會跳過新對象的交叉(因爲它不存在),只會插入(或更新)傳入的值。

所以這個:

let thing = Something(value: [...whatever...]) 
try! realm.write { 
    realm.add(thing, update:true) 
} 

變爲:

try! realm.write { 
    let thing = realm.create(Something.self, value: [...whatever...], update: true) 
} 

注:該技術實現的境界更新的即時通訊肯定比一些對象版本比較或交叉遠 更加複雜。提供的解釋 只是爲了幫助理解問題和解決方案,而不是爲了 文件的實際工作方式

0

當你從你的服務器的價值,做一個循環,以獲取保存SomeThing已經匹配id,然後更新它的title並與ID一起system,這樣可以保持favourited,這是唯一的我想我的方式,我不認爲有做你提到的。

除此之外,你正在創建新的對象,並嘗試更新它已經在領域內的將導致錯誤,我想,不知道現在可以嗎?由於境界對象不僅包含那些屬性聲明,但更多的從它的超類

+0

感謝您的回覆。我使用主鍵,所以當我告訴領域添加對象時,如果主鍵存在,它會更新它。我試圖避免將對象從數據庫中拉出來,因爲那樣會(我想)會減慢速度。我發現'realm.create'解決了它! – TRG