我的設備類中定義爲這樣的:從數組添加值到境界數據庫
class Device: Object {
dynamic var asset_tag = ""
}
我有這樣["43", "24", "23", "64"]
一個數組,我想通過數組循環,並添加每一個到Realm中的Device實體的asset_tag屬性中。
我的設備類中定義爲這樣的:從數組添加值到境界數據庫
class Device: Object {
dynamic var asset_tag = ""
}
我有這樣["43", "24", "23", "64"]
一個數組,我想通過數組循環,並添加每一個到Realm中的Device實體的asset_tag屬性中。
要在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
}
}
是這個使用Realm而不是核心數據的負面影響?循環訪問數組並使用Core Data插入屬性更容易嗎? – Martheli
這並不是一個負面因素。這就是Realm的工作原理,與我的觀點相比,Core Data更好。還有一種方法可以告訴我你在哪裏循環並將數據輸入到Realm中,但我給你的解決方案是最佳實踐。通常情況下,你應該使用更高階的函數,比如map,而不是for循環,因爲它更快,所以這就是我給你的。如果你正在考慮Realm vs Core Data,請堅持Realm。領域更快,更安全。 – gwinyai
您可能需要閱讀本文以瞭解更多關於爲什麼使用map而不是for循環的說明https://medium.com/@mimicatcodes/simple-higher-order-functions-in-swift-3-0-map-filter - 減少和-flatmap-984fa00b2532。我知道你想要一個循環,我可以給你一個循環,但是我給你的解決方案是最好的辦法,即使它看起來有點嚇人。 – gwinyai