5

コアデータオブジェクトでNSManagedObjectIDをアーカイブ/アーカイブ解除しようとしています。これにより、次回アプリを起動したときに、これらのIDを取得し、それらを使用して特定のオブジェクトをフェッチできます。

次のようにIDを「アーカイブ」してみました。

//defaultConfiguration is an NSManagedObject defined elsewhere and it works just fine...    
// and newObject is also properly initialized, bound to a context,etc...

ArchivedID* newID = [NSEntityDescription insertNewObjectForEntityForName:@"ArchivedID" inManagedObjectContext:managedObjectContext];
[self.defaultConfiguration addArchiveIDObject:newID];
newID.idURI = [[newObject objectID] URIRepresentation];
[managedObjectContext save:&error]; 

そして、このようにアーカイブを解除します([anyObject]をテストしているので、この時点で1つしかありません):

NSManagedObjectID* ID = [managedObjectContext.persistentStoreCoordinator managedObjectIDForURIRepresentation:[defaultConfiguration.archiveID anyObject]];

しかし、上記のようにURLを取得しようとすると、次の例外が発生します。

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[ArchivedID relativeString]: unrecognized selector sent to instance 0x7f59f20'

エンティティの属性はXcodeを介して「変換可能」に設定され、コアデータのドキュメントは空の場合はデフォルトのトランスフォーマーを使用することを示唆しているように見えるため、Xcodeのトランスフォーマー値フィールドを空のままにしました。

私は何が間違っているのですか?

4

4 に答える 4

1

URL を保存しなくても、この問題を解決できる可能性があります。モデルにブール値フラグを追加し、取得するオブジェクトを true としてマークすることを検討してください。その後、アプリの次回起動時にフラグ付きオブジェクトをフェッチします。

ただし、URL の文字列バージョンを取得して-absoluteString保存することもできます。

于 2012-04-19T15:01:06.690 に答える
0

わかりました...コーディングから14時間経ちました。私は..ええと..ばかです:

ArchivedIDオブジェクトの属性にアクセスするのを忘れました。あれは:

NSManagedObjectID* ID = [managedObjectContext.persistentStoreCoordinator managedObjectIDForURIRepresentation:[defaultConfiguration.archiveID anyObject]];

する必要があります

NSManagedObjectID* ID = [managedObjectContext.persistentStoreCoordinator managedObjectIDForURIRepresentation:[[defaultConfiguration.archiveID anyObject] idURI]];
于 2012-04-19T15:10:58.563 に答える
0

うーん。CoreData でこれを行うには、もっと簡単な方法があるようです。CoreData はオブジェクト グラフであることを思い出してください。関係を追跡するのが得意です。

好きなオブジェクトとの 1 対多の関係を維持するエンティティを CoreData に入れてみませんか? 次に、オブジェクトのコレクションに対して挿入/削除/検索/反復/何でもできます。

于 2012-04-19T16:14:34.460 に答える
-1

@kevbohが提案したものが好きです。objectID特定NSManagedObjectの のを に格納することも検討してNSUserDefaultsください。例えば:

[[NSUserDefaults standardUserDefaults] setObject:featuredNSManagedObjectIDArray
                                          forKey:@"FeaturedNSManagedObjectIDs"];
于 2012-04-19T15:20:01.690 に答える