2013-05-28 27 views
7

Tôi có mô hình dữ liệu sau đây trong ứng dụng của tôi:CoreData kiểm tra nếu to-many-mối quan hệ chứa đối tượng

data model

Về cơ bản tôi muốn để lưu trữ tên nước là tốt như tên thành phố. Mỗi thành phố thuộc về một quốc gia và một quốc gia có chứa 0 - n thành phố.

Trước khi tôi thêm thành phố mới vào một quốc gia cụ thể, tôi cần biết quốc gia đã chứa thành phố có tên này chưa.

Cho đến bây giờ tôi làm điều này:

- (BOOL)countryForName:(NSString *)countryName containsCity:(NSString *)cityName { 
    Countries *country = [self countryForName:countryName]; 
    NSSet *cityNames = [country valueForKey:@"cities"]; 
    for (Cities *city in cityNames) { 
     if ([city.cityName isEqualToString:cityName]) { 
      return YES; 
     } 
    } 
    return NO; 
} 

Điều này rõ ràng là rất chậm, những gì tôi cần là một tương đương lấy với một vị chính xác. Tôi thực hiện tìm kiếm một thực thể như sau:

NSEntityDescription *entity  = [NSEntityDescription entityForName:@"Countries" inManagedObjectContext:self.managedObjectContext]; 
    [fetchRequest setEntity:entity]; 

    // Edit the sort key as appropriate. 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"countryName" ascending:YES]; 
    NSArray *sortDescriptors   = @[sortDescriptor]; 
    fetchRequest.sortDescriptors  = sortDescriptors; 

    // Edit the section name key path and cache name if appropriate. 
    // nil for section name key path means "no sections". 
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"GetCountryList"]; 
    aFetchedResultsController.delegate = self; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"countryName == %@", countryName]; 
    [aFetchedResultsController.fetchRequest setPredicate:predicate]; 

Nhưng làm cách nào để thực hiện điều này nếu tìm kiếm liên quan đến nhiều thực thể? Hay nói cách khác: Làm cách nào để thêm tên thành phố duy nhất cho một quốc gia?
Cảm ơn bạn rất nhiều!

Trả lời

11

Nếu bạn muốn kiểm tra xem một đối tượng quốc gia nhất định đã có chứa một thành phố với một cái tên, bạn có thể làm

Countries *country = ... 
NSString *cityName = ... 
if ([[country valueForKeyPath:@"cities.name"] containsObject:cityName]) { 
    // ... 
} 

Hoặc, sử dụng một yêu cầu lấy:

NSString *countryName = ... 
NSString *cityName = ... 
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Countries"]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"countryName == %@ AND ANY cities.cityName == %@", countryName, cityName]; 
[fetchRequest setPredicate:predicate]; 

NSError *error; 
NSUInteger count = [self.managedObjectContext countForFetchRequest:fetchRequest error:&error]; 

if (count == NSNotFound) { 
    // error 
} else if (count == 0) { 
    // no matching country 
} else { 
    // at least one matching country 
} 

Lưu ý rằng một NSFetchedResultsController thường được sử dụng để hiển thị nội dung của yêu cầu tìm nạp trong chế độ xem bảng, vì vậy không cần thiết ở đây.

+0

Hi Martin, cảm ơn bạn đã trả lời này. Giải pháp này chỉ trông giống như một chút cải tiến đối với mã của tôi. Không có cách nào để tạo fetchrequest và sau đó thực hiện 'countForFetchRequest:' return 0 cho "quốc gia không chứa thành phố này" hoặc giá trị> 0 cho "quốc gia chứa thành phố này"? Tôi không thực sự muốn tạo ra các đối tượng để giảm thiểu việc sử dụng bộ nhớ ... – pmk

+0

@pmk: Bạn nói đúng. Tôi đã cập nhật câu trả lời. –

+0

Tôi vừa thử nghiệm mã của bạn, nó hoạt động hoàn hảo ngay bây giờ. Tôi đã chỉnh sửa mã câu trả lời của bạn để những người khác có thể tận dụng lợi thế của nó, cảm ơn bạn rất nhiều :) – pmk

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