【问题标题】:Why Realm stores values in wrong order?为什么 Realm 以错误的顺序存储值?
【发布时间】:2021-06-25 05:14:18
【问题描述】:

我有一个响应,我将该响应存储在领域数据库中, 我得到了以下响应,但它以错误的顺序保存。

它保存在如下领域中,

 “appData3”
 “appData8”
 “appData4”
 “appData1”
 “appData7”
 “appData1”
 “appData6”
 “appData5”

回复如下

{
"data": {
"APP_DATA_1": {
"vValue": “appData1”
},
"APP_DATA_2": {
"vValue":“appData2”
},
"APP_DATA_3": {
"vValue": “appData3”
},
"APP_DATA_4": {
"vValue":“appData4”
},
"APP_DATA_5": {
"vValue": “appData5”
},
"APP_DATA_6": {
"vValue": “appData6”
},
"APP_DATA_7": {
"vValue": “appData7”
},
"APP_DATA_8": {
"vValue": “appData8”
}
}
}

我使用以下代码存储价值

DataManager.shared.store(from: data.data.appData1)
DataManager.shared.store(from: data.data.appData2)
DataManager.shared.store(from: data.data.appData3)
DataManager.shared.store(from: data.data.appData4)
DataManager.shared.store(from: data.data.appData5)
DataManager.shared.store(from: data.data.appData6)
DataManager.shared.store(from: data.data.appData7)
DataManager.shared.store(from: data.data.appData8)



 func store<T>(from object: T) where T: Object {
     
        realmMainDB.beginWrite()
        
        realmMainDB.add(object, update: .all)
        
        try! realmMainDB.commitWrite()
    }

如果您想要任何相关代码,请告诉我, 我很欣赏存储该响应的另一种方法或方式。

或者让我知道我怎样才能将该响应存储在用户默认值中。 谢谢

【问题讨论】:

  • 请不要以这种方式使用用户默认值,除非是出于应用用户偏好。用户默认值旨在存储偏好;他们首选的测量单位或媒体播放速度。见User Defaults
  • @Jay - 你能解释一下,为什么我们不能使用 UserDefaults 来存储 json 小数据?
  • 您当然可以这样做,只要它符合用户默认值的预期用途 - 请阅读我上面评论中的链接。它在问题中的使用方式似乎是存储动态应用程序级数据,而不是用户如何与应用程序交互的偏好(用户默认值)。然而,这并不是很清楚,所以我的假设可能不正确。

标签: ios swift realm


【解决方案1】:

领域结果对象没有保证的顺序,因此无论是保存还是检索,您都不应该期望结果是某种顺序。

另一方面,列表对象确实保证了它们的顺序。

如果您想对 Results 对象进行排序,请包含一个确保排序的属性,并在检索结果时始终sorted(byKeyPath: 该字段。

使用时间戳或日期字符串进行排序很流行,但这取决于用例。

日期字符串可以是 yyyymmdd 格式,因此请更新您的模型以包含该属性

{
   "data": {
      "APP_DATA_1": {
         "vValue": “appData1”
         "datestring": "20210625"
   },
      "APP_DATA_2": {
         "vValue":“appData2”
         "datestring": "20210525"
   },

什么时候阅读

let results = realm.objects(DataClass.self).sorted(byKeyPath: "datestring", ascending: true)

这样做的另一个好处是当添加新数据时,它将以正确的顺序反映在结果中。

【讨论】:

  • 我完全同意使用 sorted(KeyPath:) 但我不能包含任何新属性传入响应,我的意思是我必须使用我在 json 响应中显示的内容。你能告诉我任何提示或想法,以便我可以申请。
  • @Dhiren 如果您没有要排序的属性,那么 Realm 将按其性质返回未排序的结果。在某些情况下,它可能会被排序,但在其他情况下,它可能不会。您应该确定数据的排序方式,并包括该子句 .sorted(byKeyPath: "vValue" 例如。
  • 它给出了错误的顺序,甚至使用“vValue”进行排序。
  • @Dhiren 它将按 vValue 属性的值对数据进行排序,并且始终正确。您能否提供现有的示例数据、您的通过 vValue 过滤它的代码以及最终输出是什么?请使用该信息更新问题以澄清问题所在。请记住,当涉及到带有数字的字符串时,按字符串排序可能会很棘手。 0, 1, 2, 3, 10, 21 将排序为 0, 1, 10, 2, 21, 3,因为排序是按字典顺序完成的。
  • 它像下面一样保存在领域中,总是! “appData3” “appData8” “appData4” “appData1” “appData7” “appData1” “appData6” “appData5”
猜你喜欢
  • 2020-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多