#ios #iphone #xcode #core-data #nsmanagedobject
#iOS #iPhone #xcode #core-data #nsmanagedobject
Вопрос:
У меня есть данные неуправляемых объектов, и я хочу изменить их на управляемый объект, но это не работает. У меня есть три следующих объекта или таблицы в core data
- Продукт
- Комментарий
- Бренды
Продукт — это основная таблица, комментарий связан с продуктом отношением «Один ко многим» (1 продукт имеет много комментариев), бренд также связан с продуктом отношением «Один к одному». Я извлекаю данные со стороны сервера и записываю эти данные в эти объекты путем преобразования неуправляемого в управляемый объект. Мои данные, связанные с продуктом, записаны успешно, но комментарии и бренд не смогли. Ниже приведен мой код. У продукта есть объект SCProduct, а у комментария есть SCComment
в SCProduct.m
-(void)updateWithNMProduct:(NMProduct *)nmProduct{
NSManagedObjectContext *context = [RKManagedObjectStore defaultStore].mainQueueManagedObjectContext;
self.costPrice = [nmProduct.costPrice copy];
self.coverPhoto = [nmProduct.coverPhoto copy];
self.coverPhotoNoSize = [nmProduct.coverPhotoUrlNoSize copy];
self.coverPhotoUrl = [nmProduct.coverPhotoUrl copy];
self.coverPhotoUrlEmail = [nmProduct.coverPhotoUrlEmail copy];
self.createdAt = [nmProduct.createdAt copy];
self.deliveryDays = [nmProduct.deliveryDays copy];
self.deliveryFee = [nmProduct.deliveryFee copy];
self.desc = [nmProduct.desc copy];
self.gender = [nmProduct.gender copy];
self.liked = [nmProduct.liked copy];
self.updatedAt = [nmProduct.updatedAt copy];
self.name = [nmProduct.name copy];
self.numberOfComments = [nmProduct.numberOfComments copy];
self.promoted = nmProduct.promoted;
self.salePrice = [nmProduct.salePrice copy];
self.taxRate = [nmProduct.taxRate copy];
//comments
[self.comments bk_each:^(SCComment *comment){
[context deleteObject:comment];
}];
NSMutableOrderedSet* tempSequence = [NSMutableOrderedSet orderedSetWithOrderedSet:self.comments];
[tempSequence removeAllObjects];
self.comments = tempSequence;
for(NMComment *comment in nmProduct.comments){
SCComment *managedComment = [SCComment findOrCreate:comment.commentId];
[managedComment updateWithNonManagedData:comment];
[self addItem:managedComment toSet:self.comments];
}
NMBrand * brand = nmProduct.brand;
SCBrand *managedComment = [SCBrand findOrCreate:[NSString stringWithFormat:@"%@",brand.brandId]];
[managedComment updateWithNonManagedData:managedComment];}
В SCComment.m
-(void)updateWithNonManagedData:(NMComment *)nmComment{
self.commentId = [nmComment.commentId copy];
self.key = [nmComment.key copy];
SCCommentValue *cValue = [SCCommentValue findOrCreate:nmComment.value.commentValueId];
[cValue updateWithNonManagedData:nmComment.value];
self.value = cValue;
SCCreator *creator = [SCCreator findOrCreate:nmComment.creator.creatorId];
[creator updateWithNonManagedData:nmComment.creator];
self.creator = creator; }
Я могу нормально получать данные продукта, но не комментировать. Связь в порядке и работала с управляемым объектом. Пожалуйста, помогите мне в этом. Заранее спасибо.
Комментарии:
1. вы получаете какие-либо ошибки? Вы запускаете этот код в основном потоке? куда вы вставляете NSManagedObjects в своем контексте?
2. Нет, ошибки нет, и да, уже выполняется вся работа в основном потоке, извлекаемом с сервера и записываемом в БД. Я вставляю в конце, вызывая этот метод «saveToPersistentStore», продукт сохраняется, но комментарии нет. Я думаю, что проблема может быть в for(NMComment * комментарий в nmProduct.comments){ SCComment *managedComment = [SCComment findOrCreate:comment.commentId]; [managedComment updateWithNonManagedData:комментарий]; [self addItem:managedComment toSet:self.comments]; }
3. Из вашего сообщения не очевидно, как вы вставляете объекты в managedObjectContext … findOrCreate — это не стандартный метод NSManagedObject, а ваш пользовательский. Те же учетные записи для других ваших методов. Итак, если у одного из них есть проблема, как кто-нибудь должен сообщить?
4. Не могли бы вы подсказать мне, как мы можем добавить значения в объект NSOrder types. И если у вас такая же ситуация, как у продукта и комментариев, как от 1 до многих, как вы собираетесь добавлять значения в комментарии?
5. Я не уверен, о чем вы спрашиваете… все это подробно описано в документации Apple CoreData … Я предлагаю вам прочитать там. Без каких-либо знаний о том, как в ваших классах реализованы все их методы, невозможно помочь вам с вашей проблемой, которая может быть расположена где-то в вашем коде … попробуйте определить фактический код, который не работает должным образом, и поместите его здесь вместо всего кода выше…
Ответ №1:
в вашем методе updateWithNMProduct
-(void)updateWithNMProduct:(NMProduct *)nmProduct{
NSManagedObjectContext *context = [RKManagedObjectStore defaultStore].mainQueueManagedObjectContext;
после создания вашей context
локальной переменной попробуйте добавить эту строку…
NSManagedObject *newObject = [context insertNewObjectForEntityForName:@"Product"];
Затем используйте этот экземпляр для установки атрибутов объекта…
Например…
newObject.costPrice = [nmProduct.costPrice copy];