核心数据保存问题:无法更新可转换属性(NSArray)

时间:2011-07-06 13:07:36

标签: iphone ios core-data nsmanagedobject

我的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一直保存到终止:客户,产品,日期。但只有产品在终止后才会“重置”。

任何人

2 个答案:

答案 0 :(得分:4)

刚发现问题。来自Model Object Implementation Guide

  

如果存在用于表示属性的类的可变和不可变版本(例如NSArray和NSMutableArray),则通常应将get访问器的返回值声明为不可变对象,即使模型内部使用可变对象也是如此

我的products数组实际上是一个 NSMutableArray 实例。我通过复制products来解决它(所以我将可变数组转换为不可变数组)。现在它有效。 :)而且我不需要开始赏金......

答案 1 :(得分:0)

确实,你刚刚发现了这个问题。对不起,我刚看了你的问题,但CoreData在保存期间有几个问题。

CoreData实体中的每个属性都必须是不可变对象。