Страницы

Поиск по вопросам

четверг, 23 января 2020 г.

Неявное поведение поля NSManagedObject'а

#objective_c #ios #coredata


Имею некий NSManagedObject-обьект названный, скажем Object. У него есть поле info
типа NSString. По логике программы я должен иметь возможность сохранить в это поле
пустое значение, то есть строку нулевой длины. При сохранении я так и поступаю. Но
когда я фетчу данный обьект из Core Dat'ы и логирую значение этого поля оно уже равно
(null). Если была сохранена строка ненулевой длины то она отдается корректно. Если
это ошибка то не понимаю на каком этапе я могу ее допустить. В целях теста присваиваю
значение полю, делаю save контексту и сразу тут же его фетчу. Получаю такой результат.
Чем может быть обусловлено такое поведение?    


Ответы

Ответ 1



Ах, как я люблю вопросы, в которых (без бутылки) без research effort'а сразу и не разобраться. Если серьёзно, то мои тесты не подтверждают то, что вы говорите: ниже я привожу два тестовых сценария (у меня они оба выполняются). User - это просто тестовая entity, которая имеет поле name типа string с включенной (это дефолт у Xcode) опцией "optional" (то есть оно необязательное, то есть может быть nil'ом), я полагаю, что у вас на вашем текстовом поле optional тоже включено. Так вот первый сценарий - это мы приравниваем name тестового пользователя к пустой строке @"", сохраняем контекст и фетчим его заново. И убеждаемся, что поле таки является пустой строкой. Второй сценарий - это мы заведомо приравниваем name к nil и закономерно убеждаемся после фетча, что name - это nil. Вывод из всего этого такой: похоже вы сохраняете не строку, а nil. Некоторое время назад я создал на Github специальный репозиторий для того, чтобы изучать разные тонкости устройства Cocoa. Для этого я просто прописываю подробные тесты для соответствующих аспектов поведения Core Data или NS-объектов, которые хочу изучить. Ваш случай я только что расположил здесь см. CoreData_Integration. Если будет желание освоить такой Test-Driven способ изучения тонкостей Cocoa, можно постучаться ко мне в скайп, и я объясню, как это работает, так как инструкции по эксплуатации проекта пока что нет. describe(@"Behavior of string-NSString fields", ^{ context(@"When a string field is set to empty string", ^{ it(@"should return its value as an empty string (not nil!)", ^{ User *user = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([User class]) inManagedObjectContext:managedObjectContext()]; user.name = @""; [managedObjectContext() save:nil]; NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"User"]; NSError *error; NSArray *fetchResult = [managedObjectContext() executeFetchRequest:fetchRequest error:&error]; if (error) { NSLog(@"Error %@", error); } user = (User *)[fetchResult lastObject]; [[user.name should] equal:@""]; }); }); context(@"When a string field is set to nil", ^{ it(@"should return its value as nil", ^{ User *user = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([User class]) inManagedObjectContext:managedObjectContext()]; user.name = nil; [managedObjectContext() save:nil]; NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"User"]; NSError *error; NSArray *fetchResult = [managedObjectContext() executeFetchRequest:fetchRequest error:&error]; if (error) { NSLog(@"Error %@", error); } user = (User *)[fetchResult lastObject]; [[user.name should] beNil]; }); }); });

Комментариев нет:

Отправить комментарий