【发布时间】:2017-04-20 20:39:20
【问题描述】:
编辑以简化我的问题...
我是 Realm 新手,到目前为止,这很酷,但我很难弄清楚如何查询我的 Realm DB 以检查其中是否存在特定项目。
这是我的领域模型:
import Foundation
import RealmSwift
class ChartCount: Object{
dynamic var date: Date = Date()
dynamic var count: Int = Int(0)
}
在我的主 ViewController 中,我使用以下函数为当前一周的 7 天存储一系列 ChartCount 对象:
// function to check if this weeks days have been created in Realm DB yet and creates them if not
let realm = try! Realm()
lazy var visitors: Results<VisitorCount> = { self.realm.objects(VisitorCount.self)}()
let startOfWeekDate = Date().startOfWeek(weekday: 1)
let nextDay = 24 * 60 * 60
var startOfWeek = try! Realm().objects(VisitorCount.self)
func setThisWeeksDays(){
if charts.count == 0 {
try! realm.write() {
let defaultVisitorDates = [startOfWeekDate, startOfWeekDate + TimeInterval(nextDay), startOfWeekDate + TimeInterval(nextDay*2), startOfWeekDate + TimeInterval(nextDay*3), startOfWeekDate + TimeInterval(nextDay*4), startOfWeekDate + TimeInterval(nextDay*5), startOfWeekDate + TimeInterval(nextDay*6)]
for visitors in defaultChartrDates {
let newChartDate = ChartCount()
newChartDate.date = visitors
self.realm.add(newChartrDate)
}
}
visitors = realm.objects(ChartCount.self)
}
}
这就是创建 StartOfWeekDate
// Finds the start/end of the current week ----------------------------------------------- //
extension Date {
func startOfWeek(weekday: Int?) -> Date {
var cal = Calendar.current
var component = cal.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self)
component.to12am()
cal.firstWeekday = weekday ?? 1
return cal.date(from: component)!
}
func endOfWeek(weekday: Int) -> Date {
let cal = Calendar.current
var component = DateComponents()
component.weekOfYear = 1
component.day = -1
component.to12pm()
return cal.date(byAdding: component, to: startOfWeek(weekday: weekday))!
}
func monthDay() -> String? {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMM dd"
return dateFormatter.string(from: self)
}
}
internal extension DateComponents {
mutating func to12am() {
self.hour = 0 + 24
self.minute = 0
self.second = 0
}
mutating func to12pm(){
self.hour = 0
self.minute = 0
self.second = 0
}
}// </end> Finds the start/end of the current week ------------------------------------------ //
我要做的就是检查我的 ChartDate 模型的“日期”列,看看其中是否有包含本周第一天的对象(例如 startOfWeekDate)。
【问题讨论】:
-
如果你让
startOfWeek像现在visitors一样懒惰,由闭包初始化,会发生什么?这应该可以阻止 Swift 在初始化另一个实例变量时抱怨使用实例变量。 -
我对您的过滤器代码感到困惑 - 您似乎将日期字段与文字文本字符串“startOfWeekDate”进行比较
-
正如 Russell 所说,您的过滤器格式不正确。而不是“date = 'startOfWeekDate'”,尝试“date = \(startOfWeekDate)”
-
@AustinZ 将其更改为 "lazy var startOfWeek: Results
= {self.realm.objects(VisitorCount.self).filter("date = 'startOfWeekDate'")}()" 确实确实摆脱了错误,但最终我认为 Russell 是正确的,我使用的 Filter 方法是一种不正确的方法。我也尝试过 Realm 文档中的“lazy var startOfWeek: Results = {self.realm.objects(VisitorCount.self).filter("date = 'startOfWeekDate'")}()”也无法让它工作。基本上我只想检查“日期”对象。 -
@Mozahler 如果你是这个意思: var startOfWeek = realm.objects(VisitorCount.self).filter("date = '(startOfWeekDate)'") 我仍然收到“不使用实例成员” '领域'...” Xcode 错误。不过,我什至不确定是否需要使用过滤器,因为我只想查询整个数据库以查看是否存在特定日期。