从数组添加值到境界数据库
问题描述:
我的设备类中定义为这样的:从数组添加值到境界数据库
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