我是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 = "" }
这工作得非常好,现在我想在这个类中添加另一个数组.
如果有人知道用域名添加数组的任何其他方法,请分享.
提前致谢
解决方法
作为一般规则,使用Realm提供的一对多关系而不是尝试通过使用数组来模拟它们更有效(Realm的集合是惰性的,包含的对象仅在需要时实例化,而不是普通的Swift数组) .
在您的情况下,如果我正确理解您要执行的操作,则需要将[RealmString] Swift数组添加到_backingNickNames列表中.
为什么不使用Realm的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])
如果你想做相反的事情(从List转换为数组),只需:
let dogsArray = Array(jim.dogs)
•••••••
回到own posted solution,您可以轻松地重构模型以适应这种情况.每个Sensor对象可以连接多个Topic和几个Message对象.
只需抛弃消息和主题计算属性,并分别将topicV和messageV重命名为主题和消息.还将RealmString重命名为Topic,将RealmString1重命名为Message.
现在,您可以轻松地遍历连接到传感器的主题,例如:
for topic in sensor1.topics { ... }
或者,如果要将消息附加到传感器,可以执行以下操作(不要忘记先将新创建的对象放到DB上):
let message1 = Message() message1.stringValue = "Some text" sensor2.messages.append(message1)
所以,不需要使用中间Swift阵列.