2017-06-04 48 views
-1

我的设备类中定义为这样的:从数组添加值到境界数据库

class Device: Object { 
    dynamic var asset_tag = "" 

} 

我有这样["43", "24", "23", "64"]

一个数组,我想通过数组循环,并添加每一个到Realm中的Device实体的asset_tag属性中。

回答

1

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

    } 

    } 
+0

是这个使用Realm而不是核心数据的负面影响?循环访问数组并使用Core Data插入属性更容易吗? – Martheli

+0

这并不是一个负面因素。这就是Realm的工作原理,与我的观点相比,Core Data更好。还有一种方法可以告诉我你在哪里循环并将数据输入到Realm中,但我给你的解决方案是最佳实践。通常情况下,你应该使用更高阶的函数,比如map,而不是for循环,因为它更快,所以这就是我给你的。如果你正在考虑Realm vs Core Data,请坚持Realm。领域更快,更安全。 – gwinyai

+0

您可能需要阅读本文以了解更多关于为什么使用map而不是for循环的说明https://medium.com/@mimicatcodes/simple-higher-order-functions-in-swift-3-0-map-filter - 减少和-flatmap-984fa00b2532。我知道你想要一个循环,我可以给你一个循环,但是我给你的解决方案是最好的办法,即使它看起来有点吓人。 – gwinyai