Основная проблема сохранения данных: невозможно обновить трансформируемый атрибут (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 должен быть неизменным объектом.