【问题标题】:How to query realm swift for a specific object如何快速查询特定对象的领域
【发布时间】: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 错误。不过,我什至不确定是否需要使用过滤器,因为我只想查询整个数据库以查看是否存在特定日期。

标签: ios swift3 realm


【解决方案1】:

对于希望通过主键访问 Realm 对象的任何人(就像我一样),代码如下:

let specificPerson = realm.object(ofType: Person.self, forPrimaryKey: myPrimaryKey)

【讨论】:

    【解决方案2】:

    您无法在初始化程序中访问 Realm,但您的代码中已经有了答案。就像您对访问者所做的一样,使一周开始变得懒惰,并且在使用之前不会初始化,并且在您的初始化完成时。这是大多数领域示例的完成方式。

    lazy var startOfWeek: Result<ChartCount> = {
        return realm.objects(ChartCount.self).filter("date = 'startOfWeekDate'")
    }()
    

    或者,您可以将一周开始设为隐式展开的可选选项,并在 viewDidLoad 中对其进行初始化,或者将其设为常规可选选项

    var startOfWeek: Result<ChartCount>!
    ...
    //ViewDidLoad
    realm.objects(ChartCount.self).filter("date = 'startOfWeekDate'")
    

    【讨论】:

    • 所以你的第一次改变我得到这个 Xcode 错误 = Instance member 'realm' cannot be used on type 'ViewController'
    【解决方案3】:

    好的,我想我已经成功了。这就是我所做的:

    为了检查 Realm DB 是否有 startOfWeekDate 记录,我创建了这个函数:

    func searchForStartOfWeek(findDate: Date) -> ChartCount?{
            let predicate = NSPredicate(format: "date = %@", findDate as CVarArg)
            let dateObject = self.realm.objects(ChartCount.self).filter(predicate).first
    
            if dateObject?.date == findDate{
                return dateObject
            }
            return nil
        }
    

    然后我用它来检查它是否存在:

    func setThisWeeksDays(){
            if searchForStartOfWeek(findDate: startOfWeekDate) == nil {
                try! realm.write() {
    
    
                    let defaultChartDates = [startOfWeekDate, startOfWeekDate + TimeInterval(nextDay), startOfWeekDate + TimeInterval(nextDay*2), startOfWeekDate + TimeInterval(nextDay*3), startOfWeekDate + TimeInterval(nextDay*4), startOfWeekDate + TimeInterval(nextDay*5), startOfWeekDate + TimeInterval(nextDay*6)] // 3
    
                    for charts in defaultChartDates {
                        let newChartDate = ChartCount()
                        newChartDate.date = charts
                        self.realm.add(defaultChartDates)
                    }
                }
    
                visitors = realm.objects(ChartCount.self)
            }
        }
    

    感谢大家的帮助!

    【讨论】:

      猜你喜欢
      • 2023-03-06
      • 1970-01-01
      • 2018-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多