向 nsmangedobject 添加非持久变量

Posted

技术标签:

【中文标题】向 nsmangedobject 添加非持久变量【英文标题】:adding non-persistent variables to nsmangedobject 【发布时间】:2012-02-11 19:29:59 【问题描述】:

我有一个 NSManagedObject 的子类,我想添加几个 ivars 来跟踪一些簿记。我不希望这些变量持续存在,因此我不将它们作为数据模型的一部分。

我很难找到正确的方法。

我是否应该在我的类中创建 ivars,创建相应的属性,然后在实现中合成它们? 我是否应该不创建 ivars,而只是声明属性,然后在实现中 @dynamic 属性? 我应该采取其他方法吗?

我应该在我的 NSManagedObject 子类中进行所有自定义,还是应该创建我的子类的子类,这样如果我更改我的数据模型,当我生成 xcode 时我不会丢失所有自定义我的 NSManagedObject 子类是自动的吗?

谢谢!

【问题讨论】:

【参考方案1】:

NSManagedObject 的文档中有一个名为自定义实例变量的部分。它讨论了这两种方法。

瞬态、建模属性和 ivars 都是很好的解决方案。这取决于品味和风格。

如果您使用 ivars,要记住一个非常重要的点:您需要清除 - (void)didTurnIntoFault 中的 ivars,并在 - (void)awakeFromFetch- (void)awakeFromInsert 中设置任何初始值。您需要不要接触-didTurnIntoFault 内的任何建模属性或关系,否则您会遇到麻烦。

【讨论】:

【参考方案2】:

NSManagedObject 的每个属性都有一个名为 transient 的复选框。这样,您将拥有对象的动态访问器,而无需实际保留属性值本身。在属性名称条目的文本字段下方查找复选框。

更新如果您不想因为新属性而创建迁移,请制作标准 ivars

@interface MyMO : NSManagedObject 
    NSString *_nonPersistentAttribute;


@property (nonatomic, retain) NSString *nonPersistentAttribute;

@end

@implementation MyMO

@synthesize nonPersistentAttribute=_nonPersistentAttribute;

@end

【讨论】:

对瞬态属性进行修改会将 NSManagedObject 标记为脏。是否有任何首选方法可以添加额外的变量而不会导致对象认为它需要重新保存?而且我不需要撤消支持。谢谢 然后以通常的方式添加 iVars 和 @synthesize 访问器。 感谢您提出两种替代方案。我已经成功地使用过第二次,但是现在每当我尝试访问瞬态属性时,我只会收到“无法识别的选择器发送到实例”异常。有什么想法吗? 如果您的属性是临时的 - 请确保您在类的接口中具有该属性的 @property 以及其实现 @dynamic @thibaultd 我知道这是旧的,但只是对于任何阅读它的人......我有同样的问题,我知道这是愚蠢的:我忘记确保实体类在模型编辑器实际上匹配了我的 NSManagedObject 子类名称。所以基本上它是在一个普通的 NSManagedObject 上寻找我的瞬态属性。【参考方案3】:

聪明,

对于您的第一个问题: ivars,您有两个选择标准 ivars 或实体上的瞬态属性。两者最大的区别在于瞬态属性参与了 Core Data 的 change/dirty/undo 方面。如果您的 ivars 不需要,请不要使用瞬态属性。 (是的,使用 @property@synthesize 作为您的 ivars。)

关于您的第二个问题:在哪里进行更改?我有点像个勒德分子。 Xcode 自动生成的标头模式非常简单。因此,我第一次使用自动生成的文件创建实体并在之后编辑我的更改。坦率地说,您不会经常更改模型数据结构。因此,在这两个 .h&.m 文件中到处添加几行并不是很大的成本。还有其他机制。 Wolf Rentzch 的发电机系统备受推崇和实用。也就是说,我不相信 mogenerator 可以解决现代 Objective-C v2 Core Data 程序员面临的问题。 (Obj-C v2 使 Core Data 程序员的许多事情变得更容易。)

安德鲁

【讨论】:

【参考方案4】:

这是我过去使用的一个方便的模式:

为您的类创建一个类别并将其放入其他源文件中,例如ManagedObject+Support.h。请记住,在接口声明中,您只需使用这样的括号:

@interface ManagedObject (Support)
// declare your variables and methods
@end

通过这种方式,您无需修改​​托管对象模型即可进行更改。 (更改 MOM 在重新填充数据库、迁移等方面存在许多问题)。更改模型时,可以重新生成类文件,而不会丢失类别中的代码。

【讨论】:

以上是关于向 nsmangedobject 添加非持久变量的主要内容,如果未能解决你的问题,请参考以下文章

java中用jpa往数据库表中添加数据怎么实现?

stable/prometheus-operator - 添加持久的 grafana 仪表板

python向数据库添加数据(添加一条数据)

NSMangedObject 在索引处替换

[P4735] 最大异或和 - 可持久化Trie

我想向子表单添加一条新记录,但它总是向主表单添加一条新记录