Основная проблема сохранения данных: невозможно обновить трансформируемый атрибут (NSArray)

У меня странная проблема в приложении Core Data.

В моем приложении три объекта, но сегодня я обнаружил проблему с одним из них. Моя проблемная сущность называется Invoice и он имеет много атрибутов, в том числе Products, Это закодированный NSArray NSDictionaries (через NSValueTransformer по умолчанию).

Все работает отлично - я создаю свой счет, его клиента, его продукты и т. Д. Все работает.

Но когда я выбираю свой счет из списка, а затем пытаюсь изменить его продукты и нажимаю кнопку "Сохранить", мое сохранение работает только до тех пор, пока приложение не будет закрыто.

Проблема только с моим products массив - остальные (например, дата платежа, клиент и т. д.) сохраняются.


Что я делаю

Я сдаю Invoice объект через

NSManagedObject *inv = [self.fetchedResultsController objectAtIndexPath:indexPath];
invoiceEditor.invoice = inv;

И сохранить мои данные (в моем InvoiceEditor VC):

[self.invoice setValue:client forKey:@"Client"] // NSDictionary;
[self.invoice setValue:products forKey:@"Products"] // NSArray of NSDictionaries;
[self.invoice setValue:pmDate forKey:@"PaymentDate"] // NSDate;
// other attributes
NSManagedObjectContext *context = self.invoice.managedObjectContext;
NSError *error = nil;
if (![context save:&error]) {
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}

Все сохраняется до тех пор, пока не будет прекращено: клиент, продукты, даты. Но только продукты "сбрасываются" после прекращения.

Кто-нибудь?

2 ответа

Решение

Просто нашел проблему. Из руководства по реализации объекта модели:

Если существуют изменяемые и неизменяемые версии класса, которые вы используете для представления свойства, такие как NSArray и NSMutableArray, вы должны обычно объявлять возвращаемое значение метода доступа get как неизменяемый объект, даже если внутренне модель использует изменяемый объект.

И мой products массив был на самом деле NSMutableArray пример. Я решил это, скопировав products (поэтому я преобразовал изменяемый массив в неизменный массив). Теперь это работает.:) И мне не нужно было начинать щедрость...

Действительно, вы только что нашли проблему. Извините, я только что прочитал вашу проблему, но у CoreData есть несколько проблем при сохранении.

Каждый атрибут в CoreData Entity должен быть неизменным объектом.

Другие вопросы по тегам