0

CoreDataで永続化されたエンティティを作成しようとしています。このエンティティにはいくつかのプロパティがあり、そのうちの1つは非標準の属性であるstateです。state属性は、いくつかのプロパティを持つC構造体へのポインターです。私のデータモデルは次のようになります。

エンティティ:

MDInstance

属性:

  • 期間:整数16
  • 移動:整数16
  • 名前:文字列
  • 状態:変形可能。TransformerをMDStateTransformerに設定しました。

クラスを生成し、stateプロパティを編集しました。インターフェイスは次のようになります。

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
#import "MDState.h" // this is where the State structure is defined

@interface MDInstance : NSManagedObject

@property (nonatomic, retain) NSNumber * duration;
@property (nonatomic, retain) NSNumber * moves;
@property (nonatomic, retain) NSString * name;
@property (nonatomic) State *state; // note that this is a pointer to a struct

@end

実装は次のようになります。

#import "MDInstance.h"

@implementation MDGameInstance

@dynamic duration;
@dynamic moves;
@dynamic name;

@synthesize state;

@end

MDStateTransformerという値のトランスフォーマーを作成しました。これの実装は(おそらく)重要ではありません。私はallowsReverseTransformation戻ってきたYEStransformedValueClass戻ってき[NSValue class]た、そして私は実装transformedValue:し、reverseTransformedValue:

application:didFinishLaunchingWithOptions:最後に、次のようにAppDelegateにMDStateTransformerを登録しました。

MDStateTransformer *transformer = [[MDStateTransformer alloc] init];
[NSValueTransformer setValueTransformer:transformer forName:@"MDStateTransformer"];

MDInstanceの新しいインスタンスを作成し、その属性(state属性を含む)を設定してからエンティティを保存しようとすると、トランスフォーマーが呼び出されることはありません。

トランスフォーマーのinitメソッドにストップポイントを設定し、インスタンス化しています。別のものを入れましたがtransformedValue:、関数が呼び出されていません。

ただし、状態属性がポインターではなく単なる状態構造になるようにMDInstanceを更新し、ポインターではなく構造体で機能するようにトランスフォーマーを更新すると、transformedValue:が呼び出されます。

ac structへのポインタであるオブジェクトにカスタム属性を持つことは可能ですか?もしそうなら、私が間違っていることについて何か考えはありますか?

4

1 に答える 1

1

変換可能な属性も、実装ファイルで@dynamicはなくとして指定する必要があります。@synthesizeそのプロパティを合成することにより、コア データの外部でゲッターとセッターを提供するため、コア データが提供するアクセサーは使用されません。

于 2013-01-14T19:04:59.990 に答える