Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何查询特定对象的域swift_Ios_Swift3_Realm - Fatal编程技术网

Ios 如何查询特定对象的域swift

Ios 如何查询特定对象的域swift,ios,swift3,realm,Ios,Swift3,Realm,编辑以简化我的问题 我对Realm还不熟悉,到目前为止,它非常酷,但我很难弄清楚如何查询我的Realm DB以检查其中是否存在特定项 这是我的领域模型: import Foundation import RealmSwift class ChartCount: Object{ dynamic var date: Date = Date() dynamic var count: Int = Int(0) } 在我的主ViewController中,我使用以下功能存储当前一周7

编辑以简化我的问题

我对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)
            }
        }
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
    }
//函数,用于检查是否已在域数据库中创建了本周天数,如果尚未创建,则创建它们
让我试试!领域()
lazy-var-visitors:Results={self.realm.objects(VisitorCount.self)}()
让startOfWeekDate=Date().startOfWeek(工作日:1)
让nextDay=24*60*60
var startOfWeek=试试看!Realm().objects(VisitorCount.self)
func setThisWeeksDays(){
如果charts.count==0{
试试!realm.write(){
设defaultVisitorDates=[startOfWeekDate,startOfWeekDate+时间间隔(nextDay),startOfWeekDate+时间间隔(nextDay*2),startOfWeekDate+时间间隔(nextDay*3),startOfWeekDate+时间间隔(nextDay*4),startOfWeekDate+时间间隔(nextDay*5),startOfWeekDate+时间间隔(nextDay*6)]
适用于DefaultCharterDates中的访客{
让newChartDate=ChartCount()
newChartDate.date=访客
self.realm.add(newChartrDate)
}
}
访问者=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 ------------------------------------------ //
//查找当前周的开始/结束时间------------------------------------------//
延期日期{
func startOfWeek(工作日:整数?->日期{
var cal=日历。当前
var component=cal.dateComponents([.yearForWeekOfYear,.weekOfYear],from:self)
to12am()组件
cal.firstWeekday=工作日??1
返回校准日期(从:组件)!
}
func endOfWeek(工作日:Int)->日期{
设cal=Calendar.current
var component=DateComponents()
component.weekOfYear=1
component.day=-1
组件。to12pm()
返回计算日期(通过添加:组件,到:startOfWeek(工作日:工作日))!
}
func monthDay()->字符串{
让dateFormatter=dateFormatter()
dateFormatter.dateFormat=“MMM dd”
return dateFormatter.string(from:self)
}
}
内部扩展组件{
将func变异为12am(){
self.hour=0+24
self.minute=0
self.second=0
}
将func变异为12pm(){
self.hour=0
self.minute=0
self.second=0
}
}//查找当前周的开始/结束时间------------------------------------------//

我只想检查我的ChartDate模型的“date”列,看看其中是否有包含本周第一天的对象(例如startOfWeekDate)

您无法在初始值设定项中访问域,但您的代码中已经有了答案。让一周的开始变得懒惰,就像你为访客做的一样,直到它被使用,并且在初始化完成时,它才被初始化。这是大多数领域示例的处理方式

lazy var startOfWeek: Result<ChartCount> = {
    return realm.objects(ChartCount.self).filter("date = 'startOfWeekDate'")
}()
lazy var startOfWeek:结果={
返回realm.objects(ChartCount.self).filter(“日期='startOfWeekDate'))
}()
或者,您可以将“每周开始”设置为隐式展开的可选项,并在viewDidLoad中对其进行初始化,或者将其设置为常规可选项

var startOfWeek: Result<ChartCount>!
...
//ViewDidLoad
realm.objects(ChartCount.self).filter("date = 'startOfWeekDate'")
var startOfWeek:结果!
...
//ViewDidLoad
objects(ChartCount.self).filter(“日期='startOfWeekDate'”)

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

要检查域数据库是否具有startOfWeekDate记录,我创建了以下函数:

// 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)
            }
        }
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)
        }
    }

谢谢大家的帮助

对于任何希望通过主键(像我一样)访问领域对象的人,下面是代码:

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

如果你让
startOfWeek
像现在的
visitors
那样懒惰,用闭包初始化会发生什么?这应该可以阻止Swift在初始化另一个实例变量时抱怨使用实例变量。我被你的筛选代码搞糊涂了-你似乎在将日期字段与文本字符串“startOfWeekDate”进行比较,正如Russell提到的,你的筛选格式不正确。AustinZ将其改为“lazy var startOfWeek:Results={self.realm.objects(VisitorCount.self).filter(“date='startOfWeekDate'”)”)确实消除了错误,但最终我认为Russell是正确的,我使用的筛选方法是不正确的。我还尝试过从领域的文档中执行类似“lazy var startOfWeek:Results={self.realm.objects(VisitorCount.self).filter(“date='startOfWeekDate'))}()”的操作,但我也无法让它工作。基本上,我只想检查'date'对象。@Mozahler,如果你的意思是:var startOfWeek=realm.objects(VisitorCount.self).filter(“date='(startOfWeekDate)),我仍然会得到“Connot use instance member'realm'…”Xcode错误。不过,我甚至不确定是否有必要使用过滤器,因为我只想查询整个数据库以查看是否存在特定的日期。因此,在您的第一次更改中,我得到这个Xcode错误=实例成员'realm'不能用于'ViewController'类型