У меня есть этот кусок кода:XCode iOS6 CoreData NSFetchedResultsController не может принести новые данные
- (void) fetchRecordsStaringFrom:(double)start limit:(double)limit whereFields:(NSArray*)whereFields haveValues:(NSArray*)whereValues sortBy:(NSString*)sortField ascending:(BOOL)isascending delegateEvent:(BOOL)delegateEvent{
NSFetchRequest *_fetchRequest = [[NSFetchRequest alloc] init];
[_fetchRequest setEntity:self.entityDescription];
// Create the sort descriptors array.
// Default sort is ID
if (sortField == NULL) {
sortField = @"id";
}
NSSortDescriptor *authorDescriptor = [[NSSortDescriptor alloc] initWithKey:sortField ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:authorDescriptor, nil];
[_fetchRequest setSortDescriptors:sortDescriptors];
if (whereFields != Nil && whereValues != Nil && ([whereFields count] == [whereValues count])) {
NSMutableString *predicateString = [[NSMutableString alloc] initWithString:@""];
for (int index = 0; index < [whereFields count]; index++) {
[predicateString appendFormat:@"%@==%@", whereFields[index], whereValues[index]];
if (index < [whereFields count] - 1) {
[predicateString appendString:@" AND "];
}
}
// Delete old cache to make sure always get new data
[NSFetchedResultsController deleteCacheWithName:nil];
NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString];
[_fetchRequest setPredicate:predicate];
} else {
}
self.fetchRequest = _fetchRequest;
self.fetchResultController = [[NSFetchedResultsController alloc] initWithFetchRequest:self.fetchRequest managedObjectContext:self.context sectionNameKeyPath:nil cacheName:nil];
self.fetchResultController.delegate = self;
NSError *_error;
if (delegateEvent) {
if ([self.delegate respondsToSelector:@selector(CoreDataEntityRequestStartEvent:::)]) {
[self.delegate CoreDataEntityRequestStartEvent:self :self.fetchRequest :self.fetchResultController];
}
if (![self.fetchResultController performFetch:&_error]) {
if ([self.delegate respondsToSelector:@selector(CoreDataEntityRequestErrorEvent::)]) {
[self.delegate CoreDataEntityRequestErrorEvent:self :_error];
}
} else {
if ([self.delegate respondsToSelector:@selector(CoreDataEntityRequestSuccessEvent:::)]) {
[self.delegate CoreDataEntityRequestSuccessEvent:self :self.fetchRequest :self.fetchResultController];
}
}
if ([self.delegate respondsToSelector:@selector(CoreDataEntityRequestEndEvent:::)]) {
[self.delegate CoreDataEntityRequestEndEvent:self :self.fetchRequest :self.fetchResultController];
}
} else {
[self.fetchResultController performFetch:&_error];
}
}
Когда выполняется, вышеуказанный способ будет получать данные из базы данных SQLite, никаких проблем здесь, но когда я изменить SQLITE с использованием внешнего редактора SQLITE или другими способами, затем повторите попытку с использованием одних и тех же аргументов, он не сможет получить новые данные и сохранить полученные старые данные, если я не перезапущу приложение.
Я смотрю здесь и там, и это может быть связано с кешем, но, как вы можете видеть, я уже очищаю кеш, но все равно не могу получить новые данные.
Спасибо за ваш ответ, Ответ: Только для тестирования,
Это реальный случай: , например, в экранном UITableView, получить данные из Интернета (данные не полный) , сохраните его в базе данных, затем загрузите и отобразите в поле зрения, затем, когда одна ячейка прослушивается, вы получите полные данные из Интернета для выбранной ячейки, обновите базу данных и отобразите ее на другом экране. при возврате в UItableView и перезагрузке из базы данных набор записей должен быть изменен из-за предыдущего обновления, поэтому, когда пользователь повторно коснется одной и той же ячейки, нет необходимости получать данные из Интернета, так как мы уже выполнили данные для выбранной ячейки. Но ... как я объяснил выше, NSFetchResultController не дал новых данных, даже после обновления файла SQLITE!
Не понимаю, почему вы меняете базу данных извне, используя какой-либо сторонний редактор базы данных? –
Я обновил вопрос, см. Выше – DeckyFx