Страницы

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

суббота, 16 марта 2019 г.

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

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


Ответ

Ах, как я люблю вопросы, в которых (без бутылки) без 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]; }); }); });

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

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