将数组中的值添加到Realm数据库中

时间:2017-06-04 21:32:02

标签: ios swift realm

我的Device类定义如下:

class Device: Object {   
    dynamic var asset_tag = ""

}

我有一个像["43", "24", "23", "64"]

这样的数组

我希望遍历数组并将每个数据添加到Realm中Device实体的asset_tag属性中。

1 个答案:

答案 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

    }

    }