2

sqlite データベース内のエンティティの名前を文字列として受け取るメソッドがあり、繰り返しコードをできるだけ少なく使用するように合理化しようとしています。

ここでは、行を挿入するための呼び出しを行う準備ができている必要なオブジェクト タイプに設定しようとしている ID としてエンティティがあります。

問題は、NSEntityDescriptionエンティティへの呼び出しを行うときです。エンティティはまだクラスIDです

  id entity;

if ([entityName isEqualToString:@"yadda yadda"]) {

    entity = [EntityYadda class];
}
else if ([entityName isEqualToString:@"blah blah"]) {

    entity = [EntityBlah class];
}
else if ([entityName isEqualToString:@"Foobar"]) {

    entity = [EntityFoobar class];
}

for (int x=0; x<[data count]; x++) {

    entity = [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:context];

どこが間違っていますか?

ありがとう

4

3 に答える 3

1

私はすべて同じフィールドを持つ7つの異なるエンティティを持っているので、必要なエンティティクラスを「エンティティ」に動的に割り当てようとしているので、ループではプロパティ設定に NSEntityDescription を使用して1行しかありません。

ええと、あなたはすでに「タイプを示すフラグ フィールドを持つ 1 つのエンティティを作成しないのはなぜですか?」という考えを持っていました。これは素晴らしい質問であり、その方法を使用することを強くお勧めします。

何らかの理由でそれができない場合は、プロトコルで同一のフィールドを宣言し、これら 7 つのエンティティがすべて同じプロトコルに準拠していることを宣言できます。メソッドでは、型宣言は (の代わりにid):になりNSManagedObject<MyCustomProtocol> *ます。

于 2011-07-01T15:16:17.373 に答える
0

私は専門家ではありませんが、私が知る限り、変数を宣言する方法は 2 つしかありません。

  1. 静的型付けを使用する (変数の型を宣言するとき: UIView *myview)
  2. 動的型付けの使用 (「id」: id myObject を使用して変数を宣言する場合)

最初のケースでは、型はコンパイル時に認識され、コンパイラはコードの一貫性を確保するために一連のチェックを実行します。2 番目のケースでは、型は実行時までわかりません。いずれにせよ、( idまたは特定のクラス名を使用して) 変数の型を定義すると、それを再定義する方法はありません。

とにかく、NSSClassFromString()を使用してクラスを動的に割り当てることができ、長い if/else または switch ステートメントを回避できます。

さらに、クラスに安全にメッセージを送信できるように、respondsToSelector:(SEL) などのツールを使用できます (使用する必要があります)。

于 2011-07-01T15:17:32.997 に答える
0

typedef を作成してみませんか。

typedef enum {

EntityTypeYaddaYadda,
EntityTypeBlahBlah,
    EntityTypeFoobar

} EntityType;

次に、切り替えを実行します。

for (int x=0; x<[data count]; x++) {

switch (entity.entityType){
case EntityTypeYaddaYadda:
{
YaddaYadda *yaddaYaddaObject = [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:context];
... set properties...
}
break;

case EntityTypeBlahBlah:
{
BlahBlah *blahBlahObject = [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:context];
... set properties...
}
break;

case EntityTypeFoobar:
{
Foobar *foobarObject = [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:context];
... set properties...
}
break;
}

次に、コンテキストを保存します。

if (![managedObjectContext save:&error]) {
NSLog(@"Error while saving.");
}

読みやすく、拡張できるようにするために、コードを少し繰り返す必要がある場合があります。

于 2011-07-01T13:46:52.273 に答える