2013-07-25 3 views
1

У меня очень странная проблема, которая меня так сильно натолкнула!Основные данные, не обновляемые, обновленная модель

У меня есть сущность данных ядра, которые я только что добавили некоторые новые атрибуты:

удален - Логическое 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

Как и в сторону, я использую тот же код из первого раздела, чтобы установить другие атрибуты объектов, которые фильтруются и что, кажется, работа прекрасна!

+0

Сравнить http://stackoverflow.com/questions/16000242/core-data-nspredicate-predicatewithblock-and-predicatewithformat-in-parent-child - Вы не должны вызывать атрибут «deleted». –

+0

Привет, Мартин, это было именно это, DOH !!!!! Можете ли вы опубликовать его в качестве ответа, и я его выберу. Не могу поверить, как долго я потратил на это! –

ответ

1

Вы не должны указывать атрибут Core Data «deleted», который конфликтует с методом isDeleted от NSManagedObject.

Сравнить https://stackoverflow.com/a/16003894/1187415 для краткого анализа этой проблемы.

Существуют другие имена атрибутов, которые вызывают конфликты, например. «обновлено» (сравните Cannot use a predicate that compares dates in Magical Record). К сожалению, во время компиляции или времени выполнения нет предупреждений, и документация о том, какие допустимые имена атрибутов также являются довольно неопределенными.

0

Вещи, чтобы проверить:

  1. ли вы сохранить основные объекты данных с [managedObjectContext save:&error] в соответствующих местах (например, перед выводом на экран новых данных представления таблицы)? Вы проверили переменную ошибки?

  2. Вы перенесли правильную модель с новой версией модели?

  3. Вы читаете правильные атрибуты и правильно их показываете (в пользовательских интерфейсах или операторах журнала)?

BTW, в вашем коде вы дважды устанавливаете объект запроса.

0

Прежде чем загружать представление таблицы, попробуйте сохранить контекст перемещенного объекта.

Булево удаленное может быть 0 раньше и не должно быть изменено или оно может быть автоматически инициализировано (есть поле в инспекторе для установки значений по умолчанию) на 0. Поля даты, с другой стороны, по умолчанию равны нулю.

P.S. Используйте команду [NSNumber numberWithBoolean:YES] в Objective-C.

+0

Вы также можете использовать это: '@ YES' – Mundi

+0

@Mundi: Абсолютно, по крайней мере, если он использует последнюю версию SDK. – Paul

Смежные вопросы