【问题标题】:Swift Realm filter issueSwift Realm 过滤器问题
【发布时间】:2021-02-28 19:37:06
【问题描述】:

我有一个 Swift Realm 数据库,我试图找到一条特定的记录,该记录将占用 UIViewController 中的许多标签 - 没有 Tableview。本质上,我想根据包含日期和时间的字符串变量在数据库中搜索记录。字符串格式类似于“Feb19,21-15:47”,但会随着添加的每条新记录而变化 - 因此我需要使用字符串变量作为搜索参数。

一旦找到记录,我想获取与搜索字符串关联的整个记录​​并解析出每个字段以填充 VC 上的五个标签。我已经尝试了好几个小时才能让它工作,但我只是没有得到我需要的结果。

我的问题是:

  1. 如何格式化搜索参数以使用 tempPhotoTitle 查找记录?

  2. 一旦搜索在数据库中找到对象属性 (tempPhotoTitle),需要使用什么代码来获取同一记录/行中的所有关联属性,以便我可以将每个属性绑定到 VC 中的关联标签。

几个注意事项:我确实在每条名为“id”的记录中使用了一个自动更新主键。使用 Tableview 时,我可以使用 indexPath.row 访问每条记录,但由于我没有使用电视,所以这不可用。 tempPhotoTitle 字符串值是通过 segue 从另一个 VC 提供的。此外,数据库中只有一条记录具有搜索值。这是一些缩写代码,用于提供我的问题的要点。搜索不起作用(解析问题),因此我无法测试剩余的代码。我当然会很感激这方面的一些帮助。非常感谢和沮丧的罗杰

import UIKit
import RealmSwift

 
class Snapshot: Object {
   
    @objc dynamic var id = 0
    @objc dynamic var date: String = ""
    @objc dynamic var cTime: String = ""
    @objc dynamic var airTemp:     String = ""
    @objc dynamic var humidity:    String = ""
    @objc dynamic var photoTitle: String = ""
 
   
    
    
    override class func primaryKey() -> String {
    return "id"
}
 
convenience init( ….)
 
}

 
 
class RecordsVC: UIViewController {
 
    var tempPhotoTitle: String = ""
    var tempImage = UIImage()
   
    
    @IBOutlet weak var eDateHolder: UILabel!
    @IBOutlet weak var eTimeHolder: UILabel!
    @IBOutlet weak var eAirTempHolder: UILabel!
    @IBOutlet weak var eHumidityHolder: UILabel!
    

var editSnapShotItems: Results<Snapshot>?



override func viewDidLoad() {
         super.viewDidLoad()
         queryRecords()

}}

func queryRecords() {
       
        let realm = try! Realm()
       
        let allRecords = realm.objects(editSnapShotItems.self)
       
        let recordResult = allRecords.filter("photoTitle CONTAINS[cd] %@",   tempPhotoTitle)
        let recordResults = allRecords.filter(tempPhotoTitle)
       
        for record in recordResults {

        eDateHolder.text = record.date
        eTimeHolder.text = record.cTime
        eAirTempHolder.text = record.airTemp
        eHumidityHolder.text = record.humidity
       
}}}

【问题讨论】:

  • 不清楚为什么我需要使用字符串变量作为搜索参数。但我抛出了一个可能有帮助的答案。

标签: swift filter realm predicate


【解决方案1】:

这是此答案的对象的简化版本

class Snapshot: Object {
    @objc dynamic var date: String = ""
}

如果你创建一个对象

let snap = Snapshot()
snap.date = "Feb19,21-15:47"

然后将其存储在 Realm 中

let realm = try! Realm()
realm.write {
   realm.add(snap)
}

然后你想稍后找到它

let snapResults = realm.object(Snapshot.self).filter("date == %@", "Feb19,21-15:47")
for snap in snapResults {
   print(snap.date)
}

控制台输出将是

Feb19,21-15:47

但是……

以这种格式存储日期存在许多问题。例如,如果要对 Jan20,21-15:57、Jan21,21-15:57、Feb19,21-15:57 三个日期进行排序怎么办。逻辑上它们是按顺序排列的,但因为它们是字符串,所以它们会先用 Feb19 排序(字母表中 F 在 J 之前)。

有许多解决方案:Realm 完全支持 NSDate,因此您可以将它们存储为实际日期,或者如果您真的想使用字符串,请将它们存储为可排序的格式

202102191547

将是 2021 年 2 月 19 日 15:47,确保用 0 填充单个数字。这样可以正确地对它们进行排序、过滤等

【讨论】:

  • 谢谢杰 - 正是我所希望的。您对排序的评论非常有道理,我会做出必要的调整。感谢您的宝贵时间!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-24
  • 2016-06-26
  • 1970-01-01
相关资源
最近更新 更多