如何使用Dictionary将字符串数组存储到Realm实例中?

时间:2017-02-21 07:38:33

标签: swift3 realm

我是Realm的新手并且遇到了这个问题。

我有Dictionary喜欢这个

{
    firstName : "Mohshin"
    lastName : "Shah"
    nickNames : ["John","2","3","4"]              
}

class这样的

class User: Object {
    var firstName: String?
    var lastName: String?
    var nickNames: [String]?
}

当我尝试插入值时,它会抛出异常,如下所示

属性'nickNames'被声明为'NSArray',它不是受支持的RLMObject属性类型。所有属性都必须是基元,NSStringNSDateNSDataNSNumberRLMArrayRLMLinkingObjectsRLMObject的子类。
有关详细信息,请参阅https://realm.io/docs/objc/latest/api/Classes/RLMObject.html 我也试过

var nickNames =  NSArray()

var nickNames =  NSMutableArray()

但是没有工作。我是否需要制作Nickname模型类并创建一个属性如下,或者有一种方法可以做到这一点?

var nickNames =  List<Nickname>()

4 个答案:

答案 0 :(得分:4)

更新:

现在,您可以直接在RLMArrays或Lists中存储基本类型或其可空对应项(更具体地说:布尔值,整数和浮点数类型,字符串,日期和数据)。如果要定义此类原始值的列表,则不再需要定义繁琐的单字段包装器对象。相反,您可以自己存储原始值。

原始值列表与包含对象的列表的工作方式大致相同,如下面的示例演示Swift:

class Student : Object {
    @objc dynamic var name: String = ""
    let testScores = List<Int>()
}

// Retrieve a student.
let realm = try! Realm()
let bob = realm.objects(Student.self).filter("name = 'Bob'").first!

// Give him a few test scores, and then print his average score.
try! realm.write {
    bob.testScores.removeAll()
    bob.testScores.append(94)
    bob.testScores.append(89)
    bob.testScores.append(96)
}
print("\(bob.testScores.average()!)")   // 93.0

Realm支持的所有其他语言也支持基本类型列表。

答案 1 :(得分:0)

Realm不支持NSArray的模型属性,并且目前不支持List原始类型的属性(例如List s字符串)。现在,您应该创建一个包含昵称字符串的Nickname模型,然后存储List<Nickname>,如上面的示例代码所示。

我们的GitHub存储库中的

This ticket跟踪对基元列表的支持,尽管2014年的评论都不再具有特别相关性。如果您想知道该功能何时可用,您可以关注该票据。

(另请注意,您应将列表属性声明为let,而不是var。)

答案 2 :(得分:0)

使用List几乎是唯一的方法。初始化Nickname对象(您为List中使用创建的领域对象)时,您应该为值param提供一个数组,即使该值实际上只是一个字符串。例如:

let aNickName = Nickname(value:["John"])

这就是为什么它抛出一个错误,说“无效值'John'来初始化'Nickname'类型的对象。”

答案 3 :(得分:0)

您可以在此处找到更多详细信息。 https://academy.realm.io/posts/realm-list-new-superpowers-array-primitives/

class BlogPost: Object {
  @objc var title = ""
  let tags = List<String>()

  convenience init(title: String, tag: String) {
    self.init()
    self.title = title
    self.tags.append(tag)
  }
}

more details here