我的Core Data应用程序中存在一个奇怪的问题。
我的应用中有三个实体,但今天我发现其中一个实体存在问题。我有问题的实体名为Invoice
,它有许多属性,包括Products
。它编码了NSDurray的NSArray(通过默认的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();
}
Everythings一直保存到终止:客户,产品,日期。但只有产品在终止后才会“重置”。
任何人
答案 0 :(得分:4)
刚发现问题。来自Model Object Implementation Guide:
如果存在用于表示属性的类的可变和不可变版本(例如NSArray和NSMutableArray),则通常应将get访问器的返回值声明为不可变对象,即使模型内部使用可变对象也是如此
我的products
数组实际上是一个 NSMutableArray
实例。我通过复制products
来解决它(所以我将可变数组转换为不可变数组)。现在它有效。 :)而且我不需要开始赏金......
答案 1 :(得分:0)
确实,你刚刚发现了这个问题。对不起,我刚看了你的问题,但CoreData在保存期间有几个问题。
CoreData实体中的每个属性都必须是不可变对象。