0

私は2つのエンティティを持っています:

  • チケット
  • 解決済みのチケット

どちらのエンティティも同じ属性を持っています。Ticket NSManagedObjectaを toにコピーする最も効率的な方法は何TicketResolved NSManagedObjectですか?

カテゴリを使用することを考えています:Ticket+Copy最も安価な方法ですか? もしそうなら、私はカテゴリファイルに との#import両方を入れる必要があります。TicketTicketResolved

これが私が思いついたものです。誰かがこれが正しい方法であるかどうかアドバイスしてもらえますか。NSManagedObjectSubclass各エンティティに使用しています。

方法Ticket+Copy:

-(TicketResolved *)copyObjects:(Ticket *)ticket
{
     TicketResolved *ticketResolved = [NSEntityDescription insertNewObjectForEntityForName:@"TicketResolved" inManagedObjectContext:self.managedObjectContext];
     ticketResolved.attribute = ticket.attribute;
     // Assign rest of the ticketResolved attributes values this way
     return ticketResolved;
}

メソッドを呼び出す

#import Ticket;
#import Ticket+Copy;

@implementation
....
Ticket *ticket = [NSEntityDescription insertNewObjectForEntityForName:@"Ticket" inManagedObjectContext:self.managedObjectContext];
TicketResolved *newTicketResolved = [ticket copyObjects:ticket];
// 'newTicketResolved' now has all the keys/values that 'ticket' had.

これは正しいアプローチですか、それとももっと簡単な方法がありますか?

4

2 に答える 2

1

TicketTicketResolved実際に同じ属性を持っている場合、最も効率的なオプションは次のとおりです。

  • 取り除くTicketResolved
  • チケットが解決されたときに設定できる、 Ticketnamedにブール値フラグを追加します。resolvedYES
  • この属性を使用してリクエストを取得し、解決済みまたは未解決のチケットのいずれか必要な方を取得します。

そうすれば、実際にデータをコピーする必要はなく、作業を行わない方が、行うよりも常に効率的です。

なんらかの理由で、同じ属性を持つ 2 つの別個のエンティティが本当に必要な場合は、基本的にそれを持っているので、TicketResolvedインスタンスを作成し、すべての属性値にコードをコピーする必要があります。コードの唯一の大きな問題は、次のような行です。

Ticket *ticket = [Ticket alloc]init];

指定された初期化子を呼び出していないため、そのようなマネージド オブジェクトを作成することはできません。-[NSManagedObject initWithEntity:insertIntoManagedObjectContext:]を使用するか、使用する必要があります+[NSEntityDescription insertNewObjectForEntityForName:inManagedObjectContext:]

于 2013-10-10T16:32:18.170 に答える
0

@Tom のおかげで、質問のエラーを修正しました。

以下は私のために働いた解決策です:

TicketResolved *ticketResolved = [NSEntityDescription insertNewObjectForEntityForName:@"TicketResolved" inManagedObjectContext:self.managedObjectContext];
NSArray *keys = [[[ticket entity] attributesByName] allKeys];
NSDictionary *dict= [ticket dictionaryWithValuesForKeys:keys];
[ticketResolved setValuesForKeysWithDictionary:dict];

上記のコードは Relationships オブジェクトをコピーしません。そのためには、以下のコードを使用する必要がありました。

ticketResolved.relationshipObject = ticket.relationshipObject;
于 2013-10-10T19:37:07.210 に答える