2016-10-27 58 views
5

我是Realm中的新成员,我试图添加一个Array,就像我对字符串所做的一样,结果出现了一些错误。那么一点点的搜索后,我发现了一个解决方案:使用swift将数组添加到Realm

class Sensors : Object { 


    dynamic var name = "" 
    dynamic var message = "" 

    var topic: [String] { 
     get { 
      return _backingNickNames.map { $0.stringValue } 
     } 
     set { 
      _backingNickNames.removeAll() 
      _backingNickNames.append(objectsIn: newValue.map({ RealmString(value: [$0]) })) 
     } 
    } 
    let _backingNickNames = List<RealmString>() 

    override static func ignoredProperties() -> [String] { 
     return ["topic"] 
    } 




} 

class RealmString: Object { 
    dynamic var stringValue = "" 
} 

这是工作非常好,现在我想添加这个类里面另一个数组。 如果有人知道任何其他方式添加领域的阵列,请分享它。

在此先感谢

+0

什么是使用列表的问题? – Horst

+0

没有我说我是新的,我不是我的全部选择 –

回答

9

一般来说它的方式更有效地使用了一个一对多的境界提供的,而不是试图通过使用阵列(Realm的集合是懒惰的模仿他们的关系,对象包含有仅在需要时才实例化,而不是简单的Swift数组)。

就你而言,如果我正确理解你想要做的事情,你想添加[RealmString] Swift数组到_backingNickNames列表。

为什么不使用领域的List类的append(objectsIn:)方法(见here),像这样:

// Dog model 
class Dog: Object { 
    dynamic var name = "" 
    dynamic var owner: Person? 
} 

// Person model 
class Person: Object { 
    dynamic var name = "" 
    dynamic var birthdate = NSDate(timeIntervalSince1970: 1) 

    let dogs = List<Dog>() 
} 

let jim = Person() 

let dog1 = Dog() 
let dog2 = Dog() 

// here is where the magic happens 
jim.dogs.append(objectsIn: [dog1, dog2]) 

如果你想要做的相反(从列表到一个数组转换)只是做:

let dogsArray = Array(jim.dogs) 

••••••••

回到你的own posted solution,你可以很容易地重构模型来适应这一点。每个Sensor对象可能有几个Topic和几个Message对象。

仅有沟messagetopic计算特性和分别重命名topicVmessageVtopicsmessages。还将RealmString重命名为TopicRealmString1Message。现在

,你可以很容易地通过迭代,比如,主题连接到传感器这样的:

for topic in sensor1.topics { ... } 

或者,如果你想将消息附加到你可以做这样的事情传感器(唐”别忘了properly add新创建的对象的数据库在前):

let message1 = Message() 
message1.stringValue = "Some text" 

sensor2.messages.append(message1) 

因此,没有必要使用中介斯威夫特阵列。

+0

感谢您的答案,我会检查,看看这是我想要的 –

+0

@mikevorisis:只是好奇,如果这是以任何方式帮助你。 –

+0

其实经过一番搜索和测试后,我终于明白了这是如何工作的,我发现你的方式比我的更容易,所以我会将你的问题标记为最佳答案!再次感谢你! –

0

bogdanf说了什么,你实施它的方式都是正确的。

除基本值类型外,Realm只能存储对单数Realm Object对象的引用,以及使用List类型的Object的数组。因此,如果您想要保存一组数据类型,则必须将您想要保存的任何基本类型(如String)封装在便利的Realm Object中。

就像bogdanf说的那样,不建议将Realm List s转换成标准的Swift数组,然后再回来,因为你失去了Realm延迟加载功能的优点(这可能会导致性能和内存问题),但是内存问题可以至少可以通过在@autoreleasepool块中将代码复制数据封装在Realm中来缓解。

class MyObject: Object { 
    dynamic var childObject: MyObject? 
    let objectList = List<MyObject>() 
} 

因此,在回顾,这是直接与领域合作List对象只要有可能,并通过每一个孩子对象的领域使用@autoreleasepool你其实任何时候要循环的最佳实践。 :)

2

测试后,我设法增加另一个阵列那样:

class Sensors : Object { 


    dynamic var type = "" 
    dynamic var name = "" 
    dynamic var badge = 0 

    var topic: [String] { 
     get { 
      return topicV.map { $0.stringValue } 
     } 
     set { 
      topicV.removeAll() 
      topicV.append(objectsIn: newValue.map({ RealmString(value: [$0]) })) 
     } 
    } 

    var message: [String] { 
     get { 
      return messageV.map { $0.stringValue1 } 
     } 
     set { 
      messageV.removeAll() 
      messageV.append(objectsIn: newValue.map({ RealmString1(value: [$0]) })) 
     } 
    } 





    let topicV = List<RealmString>() 
    let messageV = List<RealmString1>() 

    override static func ignoredProperties() -> [String] { 
     return ["topic", "message"] 
    } 




} 

class RealmString: Object { 
    dynamic var stringValue = "" 
} 

class RealmString1: Object { 
    dynamic var stringValue1 = "" 
} 
+0

Mike,为什么你在Realm Lists和Swift Arrays之间来回转换并不是很清楚?这非常低效,并增加了代码的不必要的复杂性。 –

+0

我无法理解我该如何使用其他方式 –

+0

我已经更新了我的答案,以展示一种可能的方式来正确地重构代码,以利用在模型中使用完整的Realm对象和关系。 –