У меня очень странная проблема, которая меня так сильно натолкнула!Основные данные, не обновляемые, обновленная модель
У меня есть сущность данных ядра, которые я только что добавили некоторые новые атрибуты:
удален - Логическое deletedDate - Дата
У меня есть следующий код, который при нажатии устанавливает оба эти значения на основной объект данных:
- (IBAction)deleteButtonInTable:(id)sender {
//Get the ID of the currently selected item in the table
NSInteger selected = [self.tweetTableView rowForView:sender];
//Create a predicate and fetch the objects from Core Data
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"approved == NO"];
NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"postDate" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1, nil];
[request setPredicate:testForTrue];
[request setSortDescriptors:sortDescriptors];
[request setEntity:[NSEntityDescription entityForName:@"Tweet" inManagedObjectContext:_managedObjectContext]];
//Setup the Request
[request setEntity:[NSEntityDescription entityForName:@"Tweet" inManagedObjectContext:_managedObjectContext]];
//Assign the predicate to the fetch request
NSError *error = nil;
//Create an array from the returned objects
NSArray *fetchedObjects = [_managedObjectContext executeFetchRequest:request error:&error];
Tweet *selectedTweet = [fetchedObjects objectAtIndex:selected];
if (selectedTweet) {
selectedTweet.deleted = [NSNumber numberWithBool:TRUE];
selectedTweet.deletedDate = [NSDate date];
NSLog(@"%@",selectedTweet);
[self refreshTableView];
if (! self.tweetTableView){
NSLog(@"Tableview doesn't exist!!)");
}
[[self tweetTableView] reloadData];
[[self managedObjectContext] commitEditing];
[self saveAction:nil];
}
if ([self.autoWriteTweets isEqualToString:@"YES"]){
[self writeTweetsToXML];
[self saveAction:nil];
}
}
Теперь, если я смотреть объект в Xcode с некоторыми перерывами, я могу увидеть изменения атрибутов на объекте, как я пройти через функцию, но у меня есть таблица отображения источника данных, который является f чтобы показать только объекты, у которых удаленный bool установлен в true, и там ничего не появляется.
Теперь, чтобы сделать вещи еще более запутанной, у меня есть функция, которая экспортирует массив объектов:
-(void)writeTweetsToXML{
//Create new fetch request
NSFetchRequest *request = [[NSFetchRequest alloc] init];
//Set new predicate to only fetch tweets that have been favourited
NSPredicate *filterFavourite = [NSPredicate predicateWithFormat:@"approved == YES"];
NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:self.exportSort ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1, nil];
[request setSortDescriptors:sortDescriptors];
//Setup the Request
[request setEntity:[NSEntityDescription entityForName:@"Tweet" inManagedObjectContext:_managedObjectContext]];
[request setResultType:NSDictionaryResultType];
//Assign the predicate to the fetch request
[request setPredicate:filterFavourite];
NSError *error = nil;
//Create an array from the returned objects
NSArray *tweetsToExport = [_managedObjectContext executeFetchRequest:request error:&error];
NSAssert2(tweetsToExport != nil && error == nil, @"Error fetching events: %@\n%@", [error localizedDescription], [error userInfo]);
//NSString *documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
//NSString *path = [NSString stringWithFormat:@"%@/tweets.xml", documents];
NSString *writeerror;
if(tweetsToExport) {
NSString * exportLocationFull = [[NSString alloc]initWithFormat:@"%@/tweets.xml",self.exportLocation];
BOOL success = [tweetsToExport writeToFile:exportLocationFull atomically:YES];
NSLog(@"Write Status = %d to %@", success, exportLocationFull);
}
else {
NSLog(@"%@",writeerror);
}
}
Теперь, когда я смотрю на экспортируемый файл, две вещи, которые являются странно!
Во-первых, объект, который я видел бы он удален значение устанавливается истина, экспорт со значением как 0.
Во-вторых, атрибут deletedDate не экспортирует вообще, каждый, несмотря на это, находясь в ядре модель данных. Я не вижу никакого способа, которым это может произойти, поскольку я не делаю никакой конкретной фильтрации экспорта.
Это как геттер/сеттер где-то сломан, но я проверил файлы классов, и все так, как должно быть, и настроено на @dynamic.
Любая помощь будет принята с благодарностью, поскольку я немного потерял информацию о том, что, черт возьми, происходит.
Люди предупреждали меня о причудах основных данных, но это просто странно!
Приветствия
Gareth
Примечание 1
Как и в сторону, я использую тот же код из первого раздела, чтобы установить другие атрибуты объектов, которые фильтруются и что, кажется, работа прекрасна!
Сравнить http://stackoverflow.com/questions/16000242/core-data-nspredicate-predicatewithblock-and-predicatewithformat-in-parent-child - Вы не должны вызывать атрибут «deleted». –
Привет, Мартин, это было именно это, DOH !!!!! Можете ли вы опубликовать его в качестве ответа, и я его выберу. Не могу поверить, как долго я потратил на это! –