objective-c - 사용법 - swift realm example




NSPredicate:NSDate 속성의 날짜별로 개체 필터링 (6)

startDate 및 endDate를 위의 주어진 대답으로 설정하는 방법에 대한 예제 :

...

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [calendar components:(NSCalendarUnitYear | NSCalendarUnitMonth ) fromDate:[NSDate date]];
//create a date with these components
NSDate *startDate = [calendar dateFromComponents:components];
[components setMonth:1];
[components setDay:0]; //reset the other components
[components setYear:0]; //reset the other components
NSDate *endDate = [calendar dateByAddingComponents:components toDate:startDate options:0];
predicate = [NSPredicate predicateWithFormat:@"((date >= %@) AND (date < %@)) || (date = nil)",startDate,endDate];

...

여기에 한 달 안에 모든 항목을 검색했습니다. 이 예제는 'nil'날짜 검색 방법을 보여줍니다.

코어 데이터 모델에 NSDate 속성이 있습니다. 하루에 데이터베이스를 필터링하고 싶습니다. 솔루션에 NSPredicate 가 포함될 것이라고 가정하지만 모든 정보를 함께 저장하는 방법을 잘 모르겠습니다.

NSDateComponentsNSCalendar 사용하여 두 NSDate 의 날짜를 비교하는 방법을 알고 있지만 NSPredicate 필터링하는 방법은 무엇입니까?

아마도 NSManagedObject 하위 클래스에 일년, 월, 일과 함께 맨손으로 날짜를 반환 할 수있는 범주를 만들어야합니다. 그럼 NSPredicate 에서 비교할 수 있습니다. 이게 당신의 추천입니까, 아니면 더 간단한 것이 있습니까?


나는 최근에이 같은 문제를 해결하고 대체 목록에 다음을 추가하여 시작일과 종료일을 준비하는 시간을 보냈습니다 (iOS 8 이상 업데이트 된 방법 포함) ...

NSDate *dateDay = nil;
NSDate *dateDayStart = nil;
NSDate *dateDayNext = nil;

dateDay = <<USER_INPUT>>;

dateDayStart = [[NSCalendar currentCalendar] startOfDayForDate:dateDay];

//  dateDayNext EITHER
dateDayNext = [dateDayStart dateByAddingTimeInterval:(24 * 60 * 60)];

//  dateDayNext OR
NSDateComponents *dateComponentDay = nil;
dateComponentDay = [[NSDateComponents alloc] init];
[dateComponentDay setDay:1];
dateDayNext = [[NSCalendar currentCalendar] dateByAddingComponents:dateComponentDay
                                                            toDate:dateDayStart
                                                           options:NSCalendarMatchNextTime];

... 핵심 데이터 NSFetchRequest 대한 NSPredicate (이미 다른 답변에서 위에 표시된대로) ...

[NSPredicate predicateWithFormat:@"(dateAttribute >= %@) AND (dateAttribute < %@)", dateDayStart, dateDayNext]]

날짜에 대한 Swift 3.0 확장 :

extension Date{

func makeDayPredicate() -> NSPredicate {
    let calendar = Calendar.current
    var components = calendar.dateComponents([.year, .month, .day, .hour, .minute, .second], from: self)
    components.hour = 00
    components.minute = 00
    components.second = 00
    let startDate = calendar.date(from: components)
    components.hour = 23
    components.minute = 59
    components.second = 59
    let endDate = calendar.date(from: components)
    return NSPredicate(format: "day >= %@ AND day =< %@", argumentArray: [startDate!, endDate!])
}
}

그런 다음 사용하십시오 :

 let fetchReq = NSFetchRequest(entityName: "MyObject")
 fetchReq.predicate = myDate.makeDayPredicate()

라파엘의 답변에 (놀라운, 감사합니다!), 스위프트 3 포팅.

func predicateForDayFromDate(date: Date) -> NSPredicate {
    let calendar = Calendar(identifier: Calendar.Identifier.gregorian)
    var components = calendar.dateComponents([.year, .month, .day, .hour, .minute, .second], from: date)
    components.hour = 00
    components.minute = 00
    components.second = 00
    let startDate = calendar.date(from: components)
    components.hour = 23
    components.minute = 59
    components.second = 59
    let endDate = calendar.date(from: components)

    return NSPredicate(format: "YOUR_DATE_FIELD >= %@ AND YOUR_DATE_FIELD =< %@", argumentArray: [startDate!, endDate!])
}

주어진 NSDate * startDateendDate 및 NSManagedObjectContext * moc :

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(date >= %@) AND (date <= %@)", startDate, endDate];
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:[NSEntityDescription entityForName:@"EntityName" inManagedObjectContext:moc]];
[request setPredicate:predicate];

NSError *error = nil;
NSArray *results = [moc executeFetchRequest:request error:&error];

Glauco Neves 의 답변을 Swift 2.0으로 이식하고 날짜를 받고 해당 날짜의 NSPredicate 를 반환하는 함수 안에이 함수를 래핑했습니다.

func predicateForDayFromDate(date: NSDate) -> NSPredicate {
    let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)
    let components = calendar!.components([.Year, .Month, .Day, .Hour, .Minute, .Second], fromDate: date)
    components.hour = 00
    components.minute = 00
    components.second = 00
    let startDate = calendar!.dateFromComponents(components)
    components.hour = 23
    components.minute = 59
    components.second = 59
    let endDate = calendar!.dateFromComponents(components)

    return NSPredicate(format: "day >= %@ AND day =< %@", argumentArray: [startDate!, endDate!])
}




nsfetchedresultscontroller