Имею некий 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];
});
});
});
Комментариев нет:
Отправить комментарий