繁体   English   中英

如何查询特定对象的realm swift

[英]How to query realm swift for a specific object

编辑简化我的问题......

我是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)。

您无法在初始化程序中访问Realm,但您已在代码中获得答案。 像对访问者一样使周延迟开始,直到它被使用,并且在你的init完成时它将不会被初始化。 这是大多数领域示例的完成方式。

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'")

好的,我想我已经开始工作了。 这就是我做的:

要检查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)
        }
    }

感谢大家的帮助!

对于那些希望通过主键访问Realm对象的人(就像我一样),这里是代码:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM