【发布时间】:2017-06-04 21:32:01
【问题描述】:
我的设备类是这样定义的:
class Device: Object {
dynamic var asset_tag = ""
}
我有一个这样的数组["43", "24", "23", "64"]
我想遍历数组并将每一个添加到 Realm 中设备实体的asset_tag 属性中。
【问题讨论】:
我的设备类是这样定义的:
class Device: Object {
dynamic var asset_tag = ""
}
我有一个这样的数组["43", "24", "23", "64"]
我想遍历数组并将每一个添加到 Realm 中设备实体的asset_tag 属性中。
【问题讨论】:
要在 Realm 中创建数组,请使用 List。根据 Realm 的文档,List 是 Realm 中用于定义对多关系的容器类型。它继续说,“在 Object 子类上定义的 List 类型的属性必须声明为 let 并且不能是动态的。”这意味着您需要定义一个完全独立的对象来在 Realm 中创建列表,没有原生类型可以让您执行类似
的操作 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>()
}
所以现在设备有一个资产标签列表。我为资产标签添加了一个主 ID,因为您表示您可能想要添加更多属性,因此一个 ID 应该有助于使每个属性都独一无二。虽然它是可选的,所以如果你不需要它,你可以删除它。
以for循环样式将assetTags对象添加到设备对象(注意:此代码示例中的设备是您要保存资产标签的设备对象):
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
}
}
【讨论】: