Core data 用核心数据实现瞬态属性

Core data 用核心数据实现瞬态属性,core-data,properties,Core Data,Properties,我想不出来。我读到的关于瞬态属性的内容告诉我,它们可以在对象模型中以未定义的类型标识。但是编译器对此抱怨说类型未知 从核心Dat编程指南: 如果不受支持的属性是对象,则在托管对象模型中,您将其类型指定为未定义,并且它是瞬态的。实现实体的自定义类时,不需要为属性添加实例变量,您可以使用托管对象的私有内部存储。下面描述的实现需要注意的一点是,它们缓存瞬时值。这使得访问价值更加高效,这对于变更管理也是必要的。如果定义自定义实例变量,则应该在didTurnIntoFault中清理这些变量,而不是deal

我想不出来。我读到的关于瞬态属性的内容告诉我,它们可以在对象模型中以未定义的类型标识。但是编译器对此抱怨说类型未知

从核心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
#导入
#进口
@类别搜索术语;
@接口搜索结果:NSManagedObject{
@私人的
}
@属性(非原子,保留)NSString*格;
@属性(非原子,保留)NSString*详细信息;
@属性(非原子,保留)NSString*endTime;
@属性(非原子,保留)NSString*经度;
@财产(非原子,保留)NSString*城市;
@属性(非原子,保留)NSString*标题;
@属性(非原子,保留)NSString*imageLink;
@属性(非原子,保留)NSString*startTime;
@属性(非原子,保留)未知类型坐标;
@属性(非原子,保留)未知类型字幕;
@属性(非原子,保留)SearchTerms*searchUsed;
@结束
我正在尝试包含带有标题、副标题和坐标的MKAnnotation的属性。在这里,我需要从其他字段导出subtitle,并从经度和纬度导出坐标

我不知道如何协调指南所说的内容和看起来明显错误的内容,编译器也这么说

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


我还没有看到如何实现一个简单的瞬态属性的好例子。我很想把属性添加到托管对象实体中,而忘了在托管对象模型中提到它。但如果我这样做,我似乎忽略了一些事情

您需要将属性的类型更改为
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

这里的问题是,MKAnnotation协议将其
坐标
值存储在
CLLocationCoordinate2D
中,该文件不是对象,而是结构,不支持键值编码。要将其用作过渡属性,需要将其包装到对象中

如果要使用的标量类型或结构不是这些类型或结构之一 直接由核心数据支持,而非结构之一 由键值编码支持,您必须将其存储在托管数据库中 对象作为对象通常是NSValue实例,尽管您可以 还可以定义自己的自定义类。然后将其视为对象 值,如本文后面所述。这取决于 对象从NSValue(或自定义)中提取所需的结构 对象,并将结构转换为 设置值时,NSValue(或自定义)对象


假设您正在存储一个对象:使用未定义和瞬态来避免将其持久化到核心数据中是否合适?如果是这样,您应该如何处理这些
未知类型的
s?用实际型号手动更换?