【问题标题】:Add values from array into Realm database将数组中的值添加到 Realm 数据库中
【发布时间】:2017-06-04 21:32:01
【问题描述】:

我的设备类是这样定义的:

class Device: Object {   
    dynamic var asset_tag = ""

}

我有一个这样的数组["43", "24", "23", "64"]

我想遍历数组并将每一个添加到 Realm 中设备实体的asset_tag 属性中。

【问题讨论】:

    标签: ios swift realm


    【解决方案1】:

    要在 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
    
        }
    
        }
    

    【讨论】:

    • 这是使用 Realm 而不是核心数据的负面影响吗?使用 Core Data 循环遍历数组并插入属性是否更容易?
    • 这并不是真正的负面。这就是 Realm 的工作方式,我认为它比 Core Data 更好。还有另一种方法,我可以向您展示循环并将数据输入 Realm 的位置,但我给您的解决方案是最佳实践。通常,你应该使用像 map 这样的高阶函数而不是 for 循环,因为它更快,所以这就是我给你的。如果您正在考虑 Realm 与 Core Data,请坚持使用 Realm。 Realm 速度更快,线程安全性更高。
    • 您可能想阅读这篇文章以了解更多关于为什么我使用 map 而不是 for 循环 medium.com/@mimicatcodes/…。我知道你想要一个循环,我可以给你一个,但我给你的解决方案是做事的最佳方式,即使一开始看起来有点吓人。
    • 是的,看起来很困难。我唯一担心的是我想从资产标签数据开始,但我将添加我想将数组拉入的其他属性,我不知道我是否可以重新生成你为我的实体中的多个属性所做的事情。
    • 我已经为您简化了一点。在我的第二次编辑中,请查看 for 循环的处理方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多