2010-11-21 31 views
7

Tôi đang cố tìm nạp kết quả của đối tượng "MeterReading" của tôi, có hai thuộc tính, "dấu thời gian" và "đọc". "dấu thời gian" là một NSDate. Tôi đang cố gắng tìm một đối tượng với một ngày chính xác.Sử dụng NSPredicate để tìm chính xác NSDate từ NSManagedObjectContect

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MeterReading" inManagedObjectContext:context]; 
[request setEntity:entity]; 
NSLog(@"%f", [self.timestamp timeIntervalSince1970]); 

NSPredicate *pre = [NSPredicate predicateWithFormat:@"timestamp == %@", self.timestamp]; 
NSLog(@"%@", pre); 
[request setPredicate:pre]; 

Bây giờ, self.timestamp được chuyển cho ViewController khác trước, các NSLog cho thấy:

1290264372,210091

Các NSPredicate đăng

timestamp == CAST (311957172.210091, "NSDate")

Câu hỏi đầu tiên: Tại sao hai số này không giống nhau?

Câu hỏi thứ hai và quan trọng hơn: Trong ManagedContext, tôi có bốn mục nhập có ngày tháng. Nếu tôi sử dụng "< =" thay vì "==", tôi sẽ nhận được kết quả có ngày nhỏ hơn ngày tôi đã chuyển, kể cả ngày tôi muốn có. Tại sao tôi không thể có được một ngày duy nhất với toán tử "=="? Điều này có thể liên quan đến độ chính xác của ngày của tôi không?

Cảm ơn!

Trả lời

3

Đây cũng là vấn đề giống như kiểm tra bình đẳng dấu phẩy động vốn không an toàn. Khi các giá trị dấu phẩy động được truyền xung quanh, được chuyển đổi, được sử dụng trong số học, v.v., chúng mất dần độ chính xác từng chút một. Bạn có thể phải sử dụng một vị từ phức tạp hơn mà thay vào đó kiểm tra các ngày trong một dung sai nhất định; ví dụ:

NSArray *timestamps = [NSArray arrayWithObjects: 
    [self.timestamp dateByAddingTimeInterval:-1], 
    [self.timestamp dateByAddingTimeInterval:1], 
    nil 
]; 

NSPredicate *pre = [NSPredicate predicateWithFormat:@"timestamp BETWEEN %@", timestamps]; 

sẽ cho bạn bất kỳ đối tượng nào khớp với ngày cộng hoặc trừ một giây.

+0

gần như đã hoạt động, cảm ơn! đi qua mảng đã đưa ra một lỗi, nhưng tôi đã thông qua hai nsdates bằng tay cho vị từ và bây giờ nó hoạt động. :) – denbec

+0

Rất tiếc, xin lỗi về điều đó! Rất vui vì nó đã giúp, mặc dù. –

+0

Lưu ý rằng ví dụ này sẽ không hoạt động với dữ liệu cốt lõi. Bạn cần phải sử dụng một cái gì đó như thế này: http://zdam.posterous.com/core-data-fetch-by-date – SpaceTrucker

3

Câu hỏi đầu tiên: Tại sao hai số này không giống nhau?

Bên trong, NSDate dường như để lưu trữ một timestamp so với 01 tháng 1 năm 2001, và không phải ngày 1 tháng 1 năm 1970. Số 311957172.210091 lẽ là số giây kể từ 2001/01/01.

Tại sao tôi không thể có được một ngày duy nhất với toán tử "=="? Điều này có thể liên quan đến độ chính xác của ngày của tôi không?

Tôi không biết. Bạn đã kiểm tra trực tiếp tệp SQLite để xem dấu thời gian nào được lưu trữ ở đó chưa?

+0

Tôi đang nhận được dấu thời gian từ cửa hàng của mình, chuyển dấu thời gian tới một trình điều khiển chế độ xem khác và thử xóa nó ở đó. do đó tôi đang cố gắng tìm nạp cùng một đối tượng; tôi đã vượt qua dấu thời gian trước đó. đó là điều kỳ lạ. có cách nào khác để xóa một đối tượng được quản lý mà không nhận được đối tượng đó trước không? – denbec

+0

Tại sao bạn vượt qua dấu thời gian xung quanh và không phải là đối tượng? Không cần phải lấy lại nó. –

1

Đối với câu hỏi đầu tiên của bạn, tôi đặt cược các con số sẽ phù hợp nếu bạn sử dụng [self.timestamp timeIntervalSinceReferenceDate] thay vì từ năm 1970.

Đối với câu hỏi thứ hai của bạn, linh cảm của tôi là ngày trong lưu trữ đối tượng được quản lý không phải là chính xác giống như self.timestamp. Ví dụ, có thể là ngày được lưu trữ chỉ chứa một ngày chứ không phải thời gian? Bạn có thể cần phải làm một số làm tròn để có được những người để phù hợp.

+0

Thực ra, tôi đang sử dụng dấu thời gian hoặc ngày trực tiếp từ đối tượng được quản lý, chuyển nó sang một trình điều khiển chế độ xem khác, thực hiện một số nội dung khác và muốn xóa nó lại. do đó tôi cần đối tượng để xóa nó khỏi ngữ cảnh và tôi không biết cách nào khác để xóa một đối tượng trước khi tìm nạp lại nó. vì vậy, nó phải là cùng ngày tôi đang sử dụng. – denbec

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