Iphone: ошибка при вставке объектов в базовые данные - PullRequest
0 голосов
/ 12 октября 2010

У меня есть Uitableview, который загружает данные из проанализированного XML-канала. при первом анализе канала все текстовые данные сохраняются в сущности NewsItems в основных данных. после загрузки таблицы изображения, связанные с каждым объектом, выбираются асинхронно и сохраняются в отдельном объекте NewsImages, после того, как каналы / изображения сохраняются локально, все данные выбираются локально при следующем запуске приложения. NewsItems и NewsImages связаны друг с другом один на один.

У меня есть кнопка обновления, которая при нажатии удаляет все записи в NewsItems, а также удаляет все объекты в NewsImages, связанные с объектами в NewsItems, так как правила удаления отношений каскадные. После удаления канал снова анализируется, и данные снова сохраняются локально.

Моя проблема в том, что я делаю это несколько раз быстро. Я получаю эту ошибку при локальном сохранении изображений.

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unacceptable type of value for to-one relationship: property = "ItemImage"; desired type = NewsImages; given type = NewsImages; value = <NewsImages: 0x68c49f0> (entity: NewsImages; id: 0x6804730 <x-coredata:///NewsImages/t5444BEE7-6193-4C25-8AAB-F64113BEAB7546> ; data: {
    Image = <ffd8ffe0 00104a46 49460001 01000001 00010000 ffe10058 45786966 00004d4d 002a0000 00080002 01120003 00000001 0001>;
    ImageItem = nil;
}).'

Это функция, отвечающая за вставку изображений

-(void)setImage:(UIImage*)moImage ForObject:(NSManagedObjectID*)moID{
    NewsItems *newsItem = (NewsItems*)[self.managedObjectContext objectWithID:moID];
    NewsImages *newsImage = (NewsImages*)[NSEntityDescription insertNewObjectForEntityForName:@"NewsImages" inManagedObjectContext:self.managedObjectContext];
    newsImage.Image = UIImageJPEGRepresentation(moImage,1.0);
    newsItem.ItemImage = newsImage;
    [self commitSave];
}

Ответы [ 2 ]

0 голосов
/ 06 апреля 2012

У меня была такая же проблема.
Я исправил это, предоставив класс в редакторе сущностей для производного класса.

При следующей настройке возникла ошибка, которую вы описали:

Entity name : Contact <-------- User  
ObjC Class       : Contact           Default to NSManagedObject.

Следующая установка исправила это:

Entity name : Contact <-------- User  
ObjC Class  : Contact           Contact
0 голосов
/ 13 октября 2010

Я думаю, что наиболее вероятной проблемой является то, что вы передаете objectID для NewsImages объекта вместо NewsItems объекта в setImage:ForObject: и в этой строке:

NewsItems *newsItem = (NewsItems*)[self.managedObjectContext objectWithID:moID];

...В действительности вы получаете NewsImages объект, возвращенный как NewsItems.

Приведение может быть проблематичным в Objective-C, поскольку объект не будет жаловаться при возврате, если вы отправите ему сообщение, которое он не понимает.Компилятор не поймает ошибку из-за приведения.

Я бы удалил приведение, установил для возвращаемого элемента значение id следующим образом:

id newsItem = (NewsItems *) [self.managedObjectContext objectWithID: moID];

... затем зарегистрируйте его класс:

NSLog(@"class=%@",[newItem class]);

... или проверьте его в отладчике.Поскольку вы, кажется, используете пользовательские подклассы NSManagedObject, это должно подтвердить источник ошибки.

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