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
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!
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
@pmk: Bạn nói đúng. Tôi đã cập nhật câu trả lời. –
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