アプリの実行時に、プログラムでエンティティに属性を追加したいと思います。
これはあなたが推奨することですか、それとも問題につながる可能性がありますか?
どのように組み合わせる必要がNSAttributeDescription
ありNSEntityDescription
ますか?私はXcodeを使用してモデルを作成することに精通していますが、NSEntityDescription
まだ使用していません。
アプリの実行時に、プログラムでエンティティに属性を追加したいと思います。
これはあなたが推奨することですか、それとも問題につながる可能性がありますか?
どのように組み合わせる必要がNSAttributeDescription
ありNSEntityDescription
ますか?私はXcodeを使用してモデルを作成することに精通していますが、NSEntityDescription
まだ使用していません。
理論的には可能ですが、あまり実用的ではありません。
NSManagedObjectModel
プログラムだけでなく、を変更することができますNSEntityDescription
。インスタンス化されたモデルを変更する-setEntities:
と、(NSManagedObjectModel)と(NSEntityDescription)の両方が例外をトリガーすることに注意してください。-setProperties:
したがって、既存のモデルの構造を変更することはできません。新しいモデルを作成し、新しいモデルに基づいて、古いCoreDataスタックから新しいデータスタックにすべてのデータをコピーする必要があります。
NSMutableDictionaryの使用は、非常に賢明なアプローチです。
私はこれをしません。ストアがモデルと互換性がなくなると、クラッシュします。このリスクは、あなたが作成しようとしている利益に本当に価値がありますか?
「安全を期すために」、より多くの(さらに多くの)属性を事前に作成することが理にかなっていることがわかりました。未使用の属性のオーバーヘッドは実際には最小限ですが、「オンザフライ」でオブジェクトに情報を簡単に追加できる柔軟性が得られます。
コメントで指摘されているように、それを実装する1つの良い方法は、属性に個別のエンティティを使用し、それらをto-many関係として追加することです。
これはこれについて非常に詳細に話している記事です。それが役に立てば幸い。
ここではほぼ同じ手法を使用しました:EPPZQueuedObject.h
実行時にエンティティアーキテクチャを変更すると、非互換性の問題(実際には例外)が発生する可能性があると思いますが、保存されたSQLiteデータが起動時の最初のエンティティに適合しない場合。
したがって、この汎用オブジェクトEPPZQueuedObjectは2つの属性のオブジェクトであるため、この目的のためだけに別のモデルファイルを使用するつもりはありませんでした。ただし、この構造は実行時に変化しません。
@implementation EPPZQueuedObject
@dynamic creationDate;
@dynamic archivedObject;
+(NSEntityDescription*)entityDescription
{
//Describe EPPZQueuedObject.
NSEntityDescription *entityDescription = [NSEntityDescription new];
entityDescription.name = EPPZQueuedObjectEntityName;
entityDescription.managedObjectClassName = NSStringFromClass(self);
//Describe creationDate.
NSAttributeDescription *creationDateDescription = [NSAttributeDescription new];
creationDateDescription.name = @"creationDate";
creationDateDescription.attributeType = NSDateAttributeType;
creationDateDescription.attributeValueClassName = @"NSDate";
creationDateDescription.defaultValue = nil;
//Describe archivedObject.
NSAttributeDescription *archivedObjectDescription = [NSAttributeDescription new];
archivedObjectDescription.name = @"archivedObject";
archivedObjectDescription.attributeType = NSBinaryDataAttributeType;
archivedObjectDescription.attributeValueClassName = @"NSData";
archivedObjectDescription.defaultValue = nil;
//Add attributes.
entityDescription.properties = @[ creationDateDescription, archivedObjectDescription ];
//Voila.
return entityDescription;
}
@end
対応する記事の詳細:http://eppz.eu/blog/simple-core-data-sample/
私は似たようなものに取り組んでおり、「プロパティ」と呼ばれる新しいコアデータクラスを作成することを考えています。これにより、コアデータオブジェクトを「多くのプロパティとの関係」を持つように設定できます。各プロパティには、コアデータ文字列タイプの属性(「属性」、「タイプ」、「値」)があります。
これにより、コアデータオブジェクトにプロパティをその場で追加するのに十分な柔軟性が得られるはずです。これを実装する場合は、ここに投稿します