arrays - RealmSwift 上的问题:“无效的数组输入:值 (1) 多于属性 (0)。” 在尝试持久化字符串数组时
问题描述
我试图坚持一个表格视图单元格,这是一个带有问题的测验测试的结果,我需要给出的答案数组(字符串数组)所以我决定使用 RealmSwift。
我创建了这个类,当然我还在同一个文件中创建了一个 RealmString 对象,以处理以这种方式在 Realm 中持久化 String 数组的可能性:
class RealmString: Object {
dynamic var stringValue = ""
}
class Test: Object {
@objc dynamic var ID = UUID().uuidString
@objc dynamic var testScore : String = String()
@objc dynamic var testTitle : String = String()
@objc dynamic var testSubTitle : String = String()
@objc dynamic var dateOfExecution: String = String()
@objc dynamic var answersGiven: [String] {
get {
return _backingAnswersGiven.map { $0.stringValue }
}
set {
_backingAnswersGiven.removeAll()
_backingAnswersGiven.append(objectsIn: (newValue.map({ RealmString(value: [$0]) })))
}
}
let _backingAnswersGiven = List<RealmString>()
override static func ignoredProperties() -> [String] {
return ["answersGiven"]
}
override static func primaryKey() -> String? {
return "ID"
}
现在在视图控制器中:
我有一个存储结果的变量(是一个 Int 数组,它将接受十个答案,其值从 0 到 5,稍后将转换为字符串),即:[0,2,2,3,4,5,2 ,1,0,2] -> ["0","2","2","3","4","5","2","1","0","2"]
当在问题中选择一个选项时,使用此功能设置值,一切正常。
public var questionResults: [Int] = []
func setValueToQuestion(questionNumber: Int) {
questionResults[questionNumber] = optionChosen
}
测试成功完成后,所有内容都以这种方式保存:
let test = Test()
test.ID = currentTest?.ID ?? UUID().uuidString
test.testTitle = testTitleLabel.text!
test.testScore = resultNumberLabel.text!
test.testSubTitle = resultLabel.text!
test.dateOfExecution = dateTimeString
test.answersGiven = questionResults.map({String($0)})
DBManager.sharedInstance.addData(object: test)
我单独尝试了代码,还添加了断点,一切都在流程中运行,期待这一行:
test.answersGiven = questionResults.map({String($0)})
这会引发标题中显示的错误:“无效的数组输入:值 (1) 多于属性 (0)。”
我想这可能是映射错误?
然后在流程的其余部分中将此值视为 String = [String] 的简单快速数组
解决方案
有几个问题可能会导致该错误。
首先 RealmString 属性没有被持久化,因为它需要@objc
dynamic var stringValue = ""
应该
@objc dynamic var stringValue = ""
其次,这很重要,Realm 不支持 Lists 中的原语。嗯,它有点,但不是很好。
编辑: 10.7 版增加了对过滤器/查询以及原语上的聚合函数的支持,因此以下信息不再完全有效。但是,仍然需要注意。
请参阅我对这个问题的回答,但简而言之,您需要另一个类来存储字符串 - 有点像您的 RealmString 类。
class StringClass: Object {
@objc dynamic var myString = ""
}
然后将 Test 对象属性更改为使用 StringClass 属性
@objc dynamic var answersGiven = [StringClass]()
然后我看到您正在尝试使用支持的 var 和计算属性,但我不知道为什么。使用 var 本身可能更简单
let _backingAnswersGiven = List<RealmString>()
因为 List 集合已经处理了正在计算的内容。
例如,如果您设置列表,您可以将其设置为另一个列表(这会清除当前列表)。或者,当您获取 list 时let myStringList = test._backingAnswersGiven
,获取列表中的所有 StringClasses,而无需对它们进行 .map 映射。
推荐阅读
- php - ajax回调后增量计数器不起作用
- python - 在 pandas read_excel 中指定 index_col 时忽略 dtype 参数
- javascript - NodeJS 和 Mysql 连接配置被忽略
- python-3.x - 循环将熊猫数据帧的特定行中的字符串写入 PDF
- html - 如何在左右突出一个div
- python - 如果两个列表包含的表面 pygame 对象相等,我该如何检查?
- amazon-web-services - 如何从 terraform 创建 ansible 库存?
- c# - 我怎样才能让火箭围绕它的底部旋转,并统一到中间?
- python - 使用生成器为数据帧创建掩码函数
- ios - 如何保持 WidgetKit 上的现有条目刷新?