【问题标题】:Core Data saving problem: can't update transformable attribute (NSArray)核心数据保存问题:无法更新可转换属性(NSArray)
【发布时间】:2011-09-29 15:00:40
【问题描述】:

我的 Core Data 应用程序有一个奇怪的问题。

我的应用中有三个实体,但今天我发现其中一个有问题。我有问题的实体称为Invoice,它有很多属性,包括Products。它是由 NSDictionaries 编码的 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();
}

一切都保存到终止:客户、产品、日期。但只有产品在终止后“重置”。

有人吗?

【问题讨论】:

  • 澄清:“产品被‘重置’”是什么意思?你的意思是产品属性没有保存?你的意思是它恢复到以前的值?换句话说,期望在重启后看到products属性,你实际上看到了吗?
  • 您没有使用实体和关系而不是 NSArray 中的一堆 NSDictionary 对象的任何特殊原因?这是一个非常麻烦且(很可能)缓慢的设置。
  • 1.我的意思是产品属性已保存,但在我的应用程序终止后,它会返回到以前的值。 2.我不使用关系,因为我一直需要产品,即使用户已经删除了它们。我有一个名为“产品”的实体,但在我的“发票”中存储了它的副本。
  • 问题可能出在转换器或 Invoice 类中。你用的是定制变压器吗?如果是这样,请发布代码。如果不是,product 属性的 Invoice 类访问器是什么样的?

标签: iphone ios core-data nsmanagedobject


【解决方案1】:

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

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

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

【讨论】:

  • 我绞尽脑汁想知道哪种疯狂的实现细节会导致您看到的效果。为什么可变数组的行为会有所不同,它对不可变数组是多态的,因此需要在运行时采取特定的操作来区分?更有趣的是——为什么会是短暂的结果?!
  • 我不知道为什么会这样。而且我不在乎,我的应用程序可以正常工作! :P
  • 我猜这个世界上有两种程序员:一种只希​​望自己的代码能够正常工作,另一种希望了解为什么会这样。
  • 是的,但有些事情我们程序员不应该理解,我认为......一些公理......
  • 该文档并没有说您需要将其转换为非可变类型,它只是说您应该将其声明为非可变类型(一个很好的通用大部分时间遵循的规则)(.h = 声明,.m = 定义)
【解决方案2】:

确实,您刚刚发现了问题。抱歉,我刚刚阅读了您的问题,但 CoreData 在保存过程中出现了一些问题。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-12
    • 1970-01-01
    • 2014-03-09
    • 2018-11-20
    • 1970-01-01
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多