2014-07-02 13 views
9

Tôi có thuộc tính NSDate được gọi là startDate được lưu trữ trong cửa hàng lưu giữ ở định dạng sau (hình bên dưới).iOS: NSPredicate sử dụng NSDate để so sánh

enter image description here

426.174.354 = 04 tháng bảy năm 2014

tôi cần phải tạo (3) NSFetchRequest sử dụng các vị từ.

Đối startDate:

  1. fetchRequest1 sử dụng ngữ (s) cần phải lấy tất cả những gì rơi vào ngày hôm nay dựa trên thời gian thiết bị của người dùng.
  2. fetchRequest2 sử dụng vị từ cần tìm nạp mọi thứ trong quá khứ, có nghĩa là ngày hôm qua và trước đó, dựa trên thời gian thiết bị của người dùng.
  3. fetchRequest3 sử dụng vị từ cần tìm nạp mọi thứ trong tương lai, có nghĩa là bắt đầu từ ngày mai và sau đó, dựa trên thời gian của thiết bị của người dùng.

Dưới đây là đoạn code tôi có cho đến nay:

-(NSMutableArray *)getFetchPredicate:(NSUInteger)fetchRequestType 
{ 
    NSDate *now = [self getcurrentTime:[NSDate date]]; 
    NSDateFormatter *format = [[NSDateFormatter alloc] init]; 
    format.dateFormat = @"dd-MM-yyyy"; 
    format.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0]; 
    NSString *stringDate = [format stringFromDate:now]; 
    NSDate *todaysDate = [format dateFromString:stringDate]; 
    //today's date is now a date without time. 

    NSMutableArray *subpredicates; 

    if (fetchRequestType == 1) 
    { 
     NSPredicate *subPredToday = [NSPredicate predicateWithFormat:@"startDate == %@ ", todaysDate]; 
     [subpredicates addObject:subPredToday]; 
    } 
    else if (fetchRequestType == 2) 
    { 
     NSPredicate *subPredPast = [NSPredicate predicateWithFormat:@"startDate < %@", todaysDate]; 
     [subpredicates addObject:subPredPast]; 
    } 
    else if (fetchRequestType == 3) 
    { 
     NSPredicate *subPredFuture = [NSPredicate predicateWithFormat:@"startDate > %@", todaysDate]; 
     [subpredicates addObject:subPredFuture]; 
    } 
    return subPredicates; 
} 

-(NSDate *)getcurrentTime:(NSDate*)date 
{ 
    NSDate *sourceDate = date; 

    NSTimeZone* sourceTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"]; 
    NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone]; 

    NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:sourceDate]; 
    NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:sourceDate]; 
    NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset; 

    NSDate* deviceDateWithTime = [[NSDate alloc] initWithTimeInterval:interval sinceDate:sourceDate]; 
    return deviceDateWithTime; 
} 

Đoạn mã trên là không tìm nạp các đối tượng ngay từ CoreData. Tôi có cảm giác rằng các vị từ của tôi để so sánh là không chính xác. Tôi không chắc chắn cách chuyển đổi thời gian được lưu trữ ở dạng startDate thành chỉ định dạng Ngày và áp dụng điều đó trong Dự phòng để so sánh. Bất kỳ đề xuất?

+0

Không có loại yêu cầu tìm nạp nào trả về kết quả chính xác? – spassas

+0

Không. Tôi có cần phải chuyển đổi ngày được lưu trữ thành chỉ ngày không? – user1107173

Trả lời

16

Tôi nghĩ có gì đó không ổn với quan điểm của bạn là todaysDate. AFAIK, NSDate đại diện cho một điểm tuyệt đối trong thời gian, do đó, nỗ lực của bạn để tạo ra một "Ngày" mà không có "Thời gian" có vẻ vô ích. Và cũng có thể sử dụng NSDateFormatter để đặt ngày bị rung.

Tôi nghĩ rằng bạn phải tạo ra hai khác nhau NSDate đối tượng: startOfCurrentDay (ví dụ 00:00:00) và endOfCurrentDay (ví dụ 23:59:59) và cá nhân tôi sẽ làm điều đó bằng cách sử dụng một NSCalendar. Nếu bạn làm như vậy, các biến vị ngữ yêu cầu tìm nạp của bạn sẽ là:

if (fetchRequestType == 1) 
    { 
     NSPredicate *subPredToday = [NSPredicate predicateWithFormat:@"(startDate >= %@) AND (startDate <= %@)", startOfCurrentDay, endOfCurrentDay]; 
    } 
    else if (fetchRequestType == 2) 
    { 
     NSPredicate *subPredPast = [NSPredicate predicateWithFormat:@"startDate < %@", startOfCurrentDay]; 
    } 
    else if (fetchRequestType == 3) 
    { 
     NSPredicate *subPredFuture = [NSPredicate predicateWithFormat:@"startDate > %@", endOfCurrentDay]; 
    } 
+0

Điều này làm việc tuyệt vời, cảm ơn bạn! Câu hỏi cuối cùng: Các giá trị '426174354' cho' startDate' được lưu trữ trong Core Data, định dạng đó là gì? Tôi không nghĩ rằng nó trong vài giây, phải không? – user1107173

+1

Thực tế là: đó là số giây trôi qua kể từ ngày đầu tiên của ngày 1 tháng 1 năm 2001, GMT. Bạn có thể tìm thêm trong [Tham khảo NSDate] (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/Reference/Reference.html) – spassas

+0

Cảm ơn! Có lẽ bạn cũng biết điều này: http://stackoverflow.com/questions/24556123/nsfetchedresultscontroller-multiple-frcs-delegate-error-when-updating – user1107173

Các vấn đề liên quan