2017-06-04 59 views
-1

我的設備類中定義爲這樣的:從數組添加值到境界數據庫

class Device: Object { 
    dynamic var asset_tag = "" 

} 

我有這樣["43", "24", "23", "64"]

一個數組,我想通過數組循環,並添加每一個到Realm中的Device實體的asset_tag屬性中。

回答

1

要在Realm中創建數組,請使用List。根據Realm的文檔,List是Realm中用於定義多對多關係的容器類型。它繼續說:「在Object子類上定義的List類型的屬性必須聲明爲let且不能是動態的。」這意味着你需要定義一個完全獨立的對象來創建一個列表中的境界,沒有原生類型,讓你做這樣的事情

let assetTagList = List<String>(). 

您需要創建一個AssetTags對象,並利用它的列表在您的設備對象如下:

class AssetTags: Object { 
     dynamic var stringValue = "" 
    } 

    class Device: Object { 

     var asset_tags: [String] { 
    get { 
     return _assetTags.map { $0.stringValue } 
    } 
    set { 
     _assetTags.removeAll() 
     _assetTags.append(objectsIn: newValue.map({ AssetTags(value: [$0]) })) 
    } 
} 
     let _assetTags = List<AssetTags>() 

     override static func ignoredProperties() -> [String] { 
      return ["asset_tags"] 
     } 
    } 

現在你可以做到這一點,以添加資產標籤到設備。

//adding asset tags 
    let realm = try! Realm() 


    try! realm.write { 
     let device = Device() 
     device.asset_tags = ["1", "2"] 
     realm.add(device) 
    } 


    //looking at all device objects and asking for list of asset tags 
    for thisDevice in realm.objects(Device.self) { 
     print("\(thisDevice.asset_tags)") 
    } 

第二個編輯

這不是我會做的方式,但我認爲這是你可能會發現更容易理解。

class AssetTags: Object { 

     dynamic var id = 0 

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

     dynamic var tagValue = "" 
    } 

    class Device: Object { 

     let assetTags = List<AssetTags>() 

    } 

因此,現在Device有一個資產標籤列表。我爲資產標籤添加了主要ID,因爲您表示您可能需要添加更多屬性,因此ID應該有助於使每個屬性都具有唯一性。這是可選的,所以你可以刪除它,如果你不需要它。

要添加assetTags對象設備對象在一個for循環式的(注:此代碼爲例設備是你要保存的資產標籤設備對象):

var assetTagArray: [String] = ["1", "2"] 

    let realm = try! Realm() 

    for assetTag in assetTagArray { 

    let newAssetTag = AssetTags() 

    newAssetTag.tagValue = assetTag 

    newAssetTag.id = (realm.objects(AssetTags.self).max(ofProperty: "id") as Int? ?? 0) + 1 

    do { 

     try realm.write { 

      device?.assetTags.append(newAssetTag) 

     } 

    } catch let error as NSError { 

     print(error.localizedDescription) 

     return 

    } 

    } 
+0

是這個使用Realm而不是核心數據的負面影響?循環訪問數組並使用Core Data插入屬性更容易嗎? – Martheli

+0

這並不是一個負面因素。這就是Realm的工作原理,與我的觀點相比,Core Data更好。還有一種方法可以告訴我你在哪裏循環並將數據輸入到Realm中,但我給你的解決方案是最佳實踐。通常情況下,你應該使用更高階的函數,比如map,而不是for循環,因爲它更快,所以這就是我給你的。如果你正在考慮Realm vs Core Data,請堅持Realm。領域更快,更安全。 – gwinyai

+0

您可能需要閱讀本文以瞭解更多關於爲什麼使用map而不是for循環的說明https://medium.com/@mimicatcodes/simple-higher-order-functions-in-swift-3-0-map-filter - 減少和-flatmap-984fa00b2532。我知道你想要一個循環,我可以給你一個循環,但是我給你的解決方案是最好的辦法,即使它看起來有點嚇人。 – gwinyai