2011-12-22 43 views
5

Nếu AuthorNSManagedObject mô hình của tôi có một thuộc tính authorID (xác định bởi máy chủ), một NSFetchRequest sẽ hoạt động tốt hơn nếu NSPredicate lọc bởi authorID chứ không phải là đối tượng hoàn chỉnh Author? Giả sử tôi đang tìm nạp tất cả BookNSManagedObject s theo một số author nhất định. predicateFormat nào tốt hơn?Core: NSPredicate so sánh đối tượng

[NSPredicate predicateWithFormat:@"author = %@", anAuthor] 

hoặc

[NSPredicate predicateWithFormat:@"author.authorID = %@", anAuthor.authorID] 

cách tốt nhất để cấu hình này là gì? Tôi có thử nghiệm Dữ liệu cốt lõi đang hoạt động với OCUnit (SenTestingKit). IOS có một cái gì đó như Ruby's Benchmark module?

+0

Bạn có đối tượng tác giả trong tầm tay khi thực hiện tìm nạp không? Nếu bạn sử dụng đối tượng Tác giả, tôi giả sử bạn cần tìm nạp nó lần đầu tiên và sau đó thực hiện yêu cầu thứ hai cho các sách của tác giả đó (2 chuyến đi tới cơ sở dữ liệu). Nếu bạn đã có id, bạn có thể nhận được kết quả bạn cần với một yêu cầu tìm nạp. – Rog

+0

Điều này sẽ không giải quyết được vấn đề của bạn nhưng bạn biết rõ hơn rằng Tài liệu của Apple tuyên bố rằng bạn nên sử dụng '==' và không chỉ '=' khi viết các vị từ. –

Trả lời

1

Có thể đáng để chạy ứng dụng của bạn với đối số là -com.apple.CoreData.SQLDebug 1, như chi tiết here.

Sau đó bạn có thể xem liệu Dữ liệu cốt lõi có đang thực thi cùng một SQL trong cả hai trường hợp không (giả sử bạn đang sử dụng một kho lưu trữ SQLite).

0

Đầu tiên (chỉ sử dụng Author) có thể sẽ nhanh hơn, nhưng chỉ thử nghiệm mới cho bạn biết chắc chắn.

Nếu bạn lấy (ví dụ Book) đối tượng mà có một mối quan hệ với Author và bạn sử dụng một vị

[NSPredicate predicateWithFormat:@"author = %@", anAuthor] 

SQLite có thể xem bảng merge Book-Author có khóa chính phù hợp với điều đó cho author . Nói cách khác, biến vị ngữ biến thành một kiểm tra cho khóa chính của tổ chức Author. Tuy nhiên, CoreData vẫn phải tham khảo bảng hợp nhất.

Nếu bạn sử dụng

[NSPredicate predicateWithFormat:@"author.authorID = %@", anAuthor.authorID] 

sau đó SQLite sẽ phải join bảng hợp nhất với Author bảng thực tế và sau đó kết hợp các kết quả authorID cột. Đó sẽ là công việc nhiều hơn. Và nó sẽ bị hỏng nếu authorID không được lập chỉ mục.

+0

Tôi đã xem xét điều này trong khi gỡ lỗi một biến vị ngữ tương tự; Tôi không thể có được một vị từ dựa trên đối tượng để làm việc, sử dụng cùng một định dạng mà bạn có trong ví dụ đầu tiên. Kiểm tra dữ liệu trực tiếp trong sqlite xác nhận rằng nó không hoạt động. Tôi muốn biết thêm hoặc hiểu tại sao nó có thể không hoạt động – wkhatch

+0

Yêu cầu SQL trông như thế nào? Bạn đang kiểm tra loại gì? –

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