coredata学习总结(五)

Creating and Modifying Custom Managed Objects

 

managed对象是NSManagedObject类的实例或者NSManagedObject的子类。代表了entity的实例。NSManagedObject实现了所有managed object所需的基本行为。你也可以自定义NSManagedObject类,尽管不是必须的。一般自定义的类提供访问或者验证的方法。使用非标准的属性,指定依赖keys,计算派生值并且实现其它自定义逻辑。

 

Creating Custom Managed Object Subclasses

In an Objective-C managed object subclass, you can declare the properties for modeled attributes in the interface file, but you don’t declare instance variables:

  1. @interface MyManagedObject :NSManagedObject
  2.  
  3. @property (nonatomic,strong)NSString*title;
  4. @property (nonatomic,strong)NSDate*date;
  5.  
  6. @end

Notice that the properties are declared as nonatomic and strong. For performance reasons,Core Data typically does not copy object values, even if the value class adopts theNSCopyingprotocol.

In the Objective-C implementation file, you specify the properties asdynamic:

  1. @implementation MyManagedObject
  2. @dynamic title;
  3. @dynamic date;
  4. @end

In Swift, you declare the properties using the @NSManaged keyword:

  1. class MyManagedObject:NSManagedObject {
  2. @NSManaged var title: String?
  3. @NSManaged var date: NSDate?
  4. }

core data动态生成get和set方法和关系,因此,你不用再自定义访问方法。

Guidelines for Overriding Methods

NSManagedObject 自定义了许多NSObject的特性银耳managed objects可以合理的整合入core data中。core data依赖NSManagedObject的如下实现方法,你不应该复写:

 

  • primitiveValueForKey:

  • setPrimitiveValue:forKey:

  • isEqual:

  • hash

  • superclass

  • class

  • self

  • zone

  • isProxy

  • isKindOfClass:

  • isMemberOfClass:

  • conformsToProtocol:

  • respondsToSelector:

  • managedObjectContext

  • entity

  • objectID

  • isInserted

  • isUpdated

  • isDeleted

  • isFault

你不应该复写initWithEntity:insertIntoManagedObjectContext:,因为这个description会在你调试过程中触发错误,结果可能是未知的。也不应该复写valueForKey:setValue:forKeyPath:.

在复写awakeFromInsert,awakeFromFetch,的时候,验证方法例如validateForUpdate:,调用它们的父类实现。

Defining Properties and Data Storage

NSManagedObject像一个字典。是一个通常的容器提供NSEntityDescription相关对象定义的属性存储。NSManagedObject为属性提供通用的类型,包括字符串,日期,和数字。因此,你不需要在子类中定义实例变量。但是,如果你需要实现非标准的属性或者时区,你可能需要这样做。除此之外,有一些考量可以使用子类比如如果你使用大量二进制数据对象。可以查看Binary Large Data Objects (BLOBs)

Using Nonstandard Attributes

By default, NSManagedObject stores its properties as objects in an internal structure, and in general Core Data is more efficient working with storage under its own control than with using custom instance variables.

默认的,NSManagedObject将他的属性作为对象存储在外部结构中。

有时你需要使用不支持的数据类型,比如颜色和c结构体。例如,在图形程序中,你可能想定义一个有颜色和bounds属性的矩形实体,这就需要你创建一个NSManagedObject的子类。

Dates, Times, and Preserving Timezones

NSManagedObject使用NSDate来表示日期属性,并且将时间戳作为NSTimeInterval类存储,并且是基于GMT的。time zone并不显示的存储。你的确应该基于gmt来表示core data的日期类型,以便搜索在数据库可以标准化。如果你需要保留time zone信息,你需要把这个time zone属性存储在你的model中,这就需要创建一个NSManagedObject的子类。

Customizing Initialization and Deallocation

core data控制managed objects的生命周期。managed objects可以被安装,销毁如果需要的话。

当managed object被创建时,会被赋予初始值。

在典型的objc类中,你通常在init方法中复写初始化方法。在NSManagedObject中,有三种不同的方式可以自定义初始化方法。通过复写initWithEntity:insertIntoManagedObjectContext:,或者 awakeFromFetch或者awakeFromInsert。不要复写init。而且不建议initWithEntity:insertIntoManagedObjectContext:复写来自定义初始化方法。

  1. - (void)awakeFromInsert
  2. {
  3. [superawakeFromInsert];
  4. [self setCreationDate:[NSDate date]];
  5. }
    1. override funcawakeFromInsert() {
    2. super.awakeFromInsert()
    3. creationDate = NSDate()
    4. }
  • awakeFromFetch 在持久化对象被重新初始化的时候被调用(在请求期间)

你可以复写awakeFromFetch,例如,创建临时值和其它缓存。awakeFromFetch中不能显示的修改执行,所以可以使用公共的set方法。禁止改变操作意味着,尽管如此但是,你不应该操作关系,因为变动可能不会合理的传播到目标对象或者对象群中。你可以使用wakeFromInsert而不是wakeFromFetch或者performSelector:withObject:afterDelay:.方法。

复写didTurnIntoFault而不是dealloc来释放属性和变量等。在对象被析构时会自动调用didTurnIntoFault

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值