Swift 领域过滤器问题
Swift Realm filter issue
我有一个 Swift 领域数据库,我正在尝试查找将占用 UIViewController 中多个标签的特定记录 - 没有 Tableview。本质上,我想根据由日期和时间组成的字符串变量在数据库中搜索记录。字符串格式看起来像这样“Feb19,21-15:47”,但随着每条新记录的添加而变化——这就是为什么我需要使用字符串变量作为搜索参数的原因。
找到记录后,我想抓取与搜索字符串关联的整个记录并解析每个字段以填充 VC 上的五个标签。我已经尝试了几个小时来让它工作,但我就是没有得到我需要的结果。
我的问题是:
如何格式化搜索参数以使用 tempPhotoTitle 查找记录?
一旦搜索在数据库中找到对象 属性 (tempPhotoTitle),需要使用什么代码来获取同一个 record/row 中的所有关联属性,这样我就可以将每个 属性 绑定到 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
}}}
这是您针对此答案的对象的简化版本
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 填充单个数字。这样可以正确地对它们进行排序、过滤等
我有一个 Swift 领域数据库,我正在尝试查找将占用 UIViewController 中多个标签的特定记录 - 没有 Tableview。本质上,我想根据由日期和时间组成的字符串变量在数据库中搜索记录。字符串格式看起来像这样“Feb19,21-15:47”,但随着每条新记录的添加而变化——这就是为什么我需要使用字符串变量作为搜索参数的原因。
找到记录后,我想抓取与搜索字符串关联的整个记录并解析每个字段以填充 VC 上的五个标签。我已经尝试了几个小时来让它工作,但我就是没有得到我需要的结果。
我的问题是:
如何格式化搜索参数以使用 tempPhotoTitle 查找记录?
一旦搜索在数据库中找到对象 属性 (tempPhotoTitle),需要使用什么代码来获取同一个 record/row 中的所有关联属性,这样我就可以将每个 属性 绑定到 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
}}}
这是您针对此答案的对象的简化版本
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 填充单个数字。这样可以正确地对它们进行排序、过滤等