我是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属性类型。所有属性都必须是基元,NSString
,NSDate
,NSData
,NSNumber
,RLMArray
,RLMLinkingObjects
或RLMObject
的子类。
有关详细信息,请参阅https://realm.io/docs/objc/latest/api/Classes/RLMObject.html
我也试过
var nickNames = NSArray()
var nickNames = NSMutableArray()
但是没有工作。我是否需要制作Nickname模型类并创建一个属性如下,或者有一种方法可以做到这一点?
var nickNames = List<Nickname>()
答案 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>
,如上面的示例代码所示。
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)
}
}