2012-10-22 41 views
6

Trong mô hình dữ liệu cốt lõi của tôi, một Person có một hoặc nhiều Cars, được chỉ định bởi mối quan hệ vô cùng nhiều thứ tự 'Ô tô'. Thông thường, tôi cần truy xuất ô tô của một Người được yêu cầu bởi datePurchased hoặc theo số dateLastUsed.Thuộc tính được tìm nạp trong Dữ liệu chính

Cho đến bây giờ, tôi đã thêm phương thức của riêng mình vào Person cho carsByDatePurchased. Điều này sử dụng một bộ mô tả sắp xếp để sắp xếp NSSet cars và trả về một NSArray.

Thay vào đó tôi có nên sử dụng Thuộc tính được tìm nạp cho mục này không? Tôi đang trải qua một số chi phí hoạt động bằng cách sử dụng bộ mô tả sắp xếp mỗi lần tôi cần những chiếc xe theo một thứ tự nhất định, thậm chí đi xa như việc triển khai bộ nhớ đệm của riêng mình là carsByDatePurchased. Dường như thuộc tính được tìm nạp được lưu vào bộ nhớ cache cho tôi - có đúng không?

Các giới hạn của thuộc tính được tìm nạp so với triển khai của riêng tôi là gì?

Và điều quan trọng là giá trị của thuộc tính được tìm nạp có tồn tại giữa các lần thực thi không? Nếu tôi cập nhật thuộc tính đã tìm nạp và lưu ngữ cảnh của tôi, là giá trị được lưu trữ trong lần tiếp theo tôi khởi chạy ứng dụng?

Trả lời

1

Thuộc tính được tìm nạp về cơ bản là yêu cầu tìm nạp. Tôi không biết cách thêm các bộ mô tả sắp xếp vào các thuộc tính này trong GUI, nhưng tôi có thể sai. Nhưng tại sao không chỉ tạo yêu cầu tìm nạp trong phương thức carsByDatePurchased của bạn và cung cấp bộ mô tả sắp xếp? Nó trả về một mảng hoặc kết quả (mà bạn có thể bọc giá rẻ trong một NSOrderedSet với cờ copyItems: được đặt thành không).

+0

Sự khác nhau giữa điều này và chỉ truy cập vào self.cars và áp dụng bộ mô tả sắp xếp là gì? Tại sao tôi lại hưởng lợi từ việc sử dụng một yêu cầu tìm nạp khác trong thẻByDatePurchased thay vì chỉ sử dụng self.cars? –

+0

Do sắp xếp được thực hiện ở cấp cơ sở dữ liệu, thay vì bộ nhớ sau khi tìm nạp từ cơ sở dữ liệu. –

+0

Tôi có nên lấy tất cả các xe và sử dụng một vị từ để hạn chế chúng để người == tự? Hoặc tôi có thể tái sử dụng self.cars bằng bất kỳ cách nào không? –

2

Nếu bạn muốn đạt được một số hiệu suất, hãy tìm nạp bằng NSFetchedResultsController và làm cho nó hoạt động với bộ nhớ cache. Lần tiếp theo bạn thực hiện lần tìm nạp tương tự, lần tìm nạp sẽ nhanh hơn. Trong tên cụ thể của bạn, bạn sẽ phải cache tên. Hãy xem NSFetchedResultsController documentation.

+0

Nhưng các kết quả được lưu trong bộ nhớ cache sẽ tồn tại giữa các lần khởi chạy? Đó là một phần quan trọng tôi đang tìm kiếm. –

+0

Có (phần đệm vì trả lời không đủ dài) – J2theC

+0

Tốt tốt. Đây có thể là viên đạn bạc. Hôm nay tôi sẽ cố gắng. Chỉ cần rõ ràng, bạn đang đề xuất sử dụng phương pháp NSFetchedResultsController * bên trong * thẻ của tôiByDatePurchased? Phương pháp này hiện đang đặt hàng self.cars và trả về mảng - bạn đang nói nên lấy những chiếc xe và sắp xếp chúng bằng cách sử dụng bộ điều khiển kết quả * thay vì * sử dụng xe hơi. –

4

Thuộc tính đã tìm nạp sẽ hoạt động và thực sự tôi đã sử dụng nó trong dự án của riêng mình với mối quan hệ Đăng nhận xét cần được sắp xếp theo 'chỉ mục được thêm ngày'.

Có một số cảnh báo: Bạn không thể chỉ định bộ mô tả sắp xếp trong trình chỉnh sửa hình ảnh và phải chỉ định mã đó trong mã.

tôi sử dụng một cái gì đó như thế này

// Find the fetched properties, and make them sorted... 
for (NSEntityDescription *entity in [_managedObjectModel entities]) 
{ 
    for (NSPropertyDescription *property in [entity properties]) 
    { 
     if ([property isKindOfClass:[NSFetchedPropertyDescription class]]) 
     { 
      NSFetchedPropertyDescription *fetchedProperty = (NSFetchedPropertyDescription *)property; 
      NSFetchRequest *fetchRequest = [fetchedProperty fetchRequest]; 

      // Only sort by name if the destination entity actually has a "index" field 
      if ([[[[fetchRequest entity] propertiesByName] allKeys] containsObject:@"index"]) 
      { 
       NSSortDescriptor *sortByName = [[NSSortDescriptor alloc] initWithKey:@"index" 
                      ascending:YES]; 

       [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortByName]]; 
      } 
     } 
    } 
} 

Trong bài thực thể của tôi, tôi có một tài sản lấy được gọi là "sortedComments" được định nghĩa là:

post == $FETCH_SOURCE 

nơi bài viết có một to-many "ý kiến "mối quan hệ và nhận xét có một" bài đăng "nghịch đảo

Đối lập với các câu trả lời khác ở đây: Lợi ích của việc sử dụng thuộc tính được tìm nạp như thế này, là CoreData sẽ xử lý bộ nhớ đệm và làm mất hiệu lực bộ nhớ cache làm nhận xét cho bài đăng hoặc thực sự bài đăng sở hữu các thay đổi đó.

0
AppDelegate *delegate = [UIApplication sharedApplication].delegate; 
NSManagedObjectContext *context = [delegate managedObjectContext]; 

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription 
           entityForName:@"DataRecord" inManagedObjectContext:context]; 
[fetchRequest setEntity:entity]; 
NSError *error; 
fetchedObjects = [context executeFetchRequest:fetchRequest error:&error]; 
for (NSManagedObject *obj in fetchedObjects) { 
    NSLog(@"Name: %@", [obj valueForKey:@"name"]); 
    NSLog(@"Info: %@", [obj valueForKey:@"info"]); 
    NSLog(@"Number: %@", [obj valueForKey:@"number"]); 
    NSLog(@"Create Date: %@", [obj valueForKey:@"createDate"]); 
    NSLog(@"Last Update: %@", [obj valueForKey:@"updateDate"]); 
} 
NSManagedObject *obj = [fetchedObjects objectAtIndex:0]; 
[self displayManagedObject:obj]; 
selectedObject = obj; 
+0

Trong khi mã này có thể trả lời câu hỏi, cung cấp ngữ cảnh bổ sung về cách thức và/hoặc lý do giải thích vấn đề này sẽ cải thiện giá trị lâu dài của câu trả lời. –

+0

Mã này chỉ để tìm nạp –

+2

Nếu nó không phải là câu trả lời cho câu hỏi, nó không nên có ở nơi đầu tiên. Trên Stack Overflow, câu trả lời phải cung cấp một giải pháp cho câu hỏi. –

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