用核心数据实现瞬态属性

时间:2011-08-25 19:24:05

标签: core-data properties

我无法弄清楚这一点。我读到的关于瞬态属性的内容告诉我,它们可以在未定义类型的对象模型中识别。但是编译器抱怨这个类型未知的错误。

来自Core Dat编程指南:

  

如果不支持的属性是对象,则在托管对象模型中将其类型指定为未定义,并且它是瞬态的。实现实体的自定义类时,无需为属性添加实例变量 - 您可以使用托管对象的私有内部存储。关于下面描述的实现的注意事项是它们缓存瞬态值。这使得访问价值更有效 - 它也是变更管理的必要条件。如果定义自定义实例变量,则应该在didTurnIntoFault中清除这些变量,而不是dealloc或finalize。

这是头文件:

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@class SearchTerms;

@interface SearchResult : NSManagedObject {
@private
}
@property (nonatomic, retain) NSString * lattitude;
@property (nonatomic, retain) NSString * details;
@property (nonatomic, retain) NSString * endTime;
@property (nonatomic, retain) NSString * longitude;
@property (nonatomic, retain) NSString * city;
@property (nonatomic, retain) NSString * title;
@property (nonatomic, retain) NSString * imageLink;
@property (nonatomic, retain) NSString * startTime;
@property (nonatomic, retain) UNKNOWN_TYPE coordinate;
@property (nonatomic, retain) UNKNOWN_TYPE subtitle;
@property (nonatomic, retain) SearchTerms * searchUsed;

@end

我正在尝试使用标题,副标题和坐标来包含MKAnnotation的属性。在这里,我需要从其他字段派生字幕,并从经度和纬度导出坐标。

我不确定如何调和指南所说的内容以及看起来完全错误的内容,编译器也这样说。

一旦我得到了正确的标题,我可能能够正确实现,我将使用awakeFromFault来设置值。我不确定是否需要使用didTurnIntoFault释放字幕,这将是一个NSString,但这似乎是指南所说的。

我还没有看到如何实现简单瞬态属性的非常好的示例。我很想将jsut添加到托管对象实体中,而忘记在托管对象模型中提及它。但是,如果我这样做,我似乎会忽略一些东西。

2 个答案:

答案 0 :(得分:2)

您需要将属性的类型更改为id或任何最合适的类型:

@interface SearchResult : NSManagedObject
{}
@property (nonatomic, retain) id coordinate;
@end

另一种处理方法是通过KVC和依赖键:

@implementation SearchResult
+ (NSSet *) keyPathsForValuesAffectingCoordinate
{
  return [NSSet setWithObjects:@"latitude", @"longitude", nil];
}

- (id) coordinate
{
  // Derive the coordinate value
}
@end

答案 1 :(得分:1)

这里的问题是MKAnnotation协议将其coordinate值存储在CLLocationCoordinate2D中,它不是对象而是结构,并且它不支持键值编码。要将其用作过渡属性,您需要将其包装在对象中。

The Core Data Programming Guide: Scalar Value Constraints

  

如果要使用不属于其中的标量类型或结构   由Core Data直接支持,而不是其中一个结构   通过键值编码支持,您必须将其存储在托管中   对象作为对象 - 通常是NSValue实例,尽管你可以   还定义了自己的自定义类。然后,您将其视为一个对象   值,如本文后面所述。这取决于用户   从NSValue(或自定义)中提取所需结构的对象   检索值时的对象,以及将结构转换为   设置值时的NSValue(或自定义)对象。