我的Device类定义如下:
class Device: Object {
dynamic var asset_tag = ""
}
我有一个像["43", "24", "23", "64"]
我希望遍历数组并将每个数据添加到Realm中Device实体的asset_tag属性中。
答案 0 :(得分:1)
要在Realm中创建数组,请使用List。根据Realm的文档,List是Realm中用于定义多对多关系的容器类型。接着说,“在Object子类上定义的List类型的属性必须声明为let,不能是动态的。”这意味着您需要定义一个完全独立的对象来在Realm中创建一个列表,没有允许您执行类似
的本机类型 let assetTagList = List<String>().
您需要创建一个AssetTags对象,并在Device对象中创建一个列表,如下所示:
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应该有助于使每个属性唯一。它是可选的,因此如果您不需要它,可以将其删除。
以for循环样式将assetTags对象添加到Device对象(注意:此代码中的 device 是您要将资产标签保存到的设备对象):
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
}
}