10

作成したタイプの一意の識別子を取得する必要がありNSManagedObjectます。オブジェクトが作成されるとすぐに利用可能であり、決して変更されず、完全に一意である必要があります。

これNSManagedObjectIDは、コンテキストが保存されるときに変更される可能性があるため、除外されます。オブジェクトが同じプロパティを持っている場合、-hashメソッドは一意ではない可能性があると思います。

これは無駄で面倒に思えるので、そうでなければ役に立たないuniqueIdentifier UUIDフィールドをエンティティに作成することは避けたいと思います。ここで受け入れられているベストプラクティスはありますか?

4

3 に答える 3

13

URIRepresentationのプロパティを試してくださいNSManagedObjectID。これは現在のIDとしては非常に一意ですが、保存されなくなるまでは一時的なIDのみを提供し、永続的なIDは提供しないため、異なる場合があるNSManagerObjectことに注意してください。(一意のIDを何をどのように使用したいかわからないため、これを言っているだけです。) NSManagedObject

更新#1

これ架空の一意のIDだけではありません。これは、各個人の純粋な一意のURLです(すべてのファイルに一意のURLがあるように)。これらを使用すると、ポインターを失った後NSManagedObject、元のIDを再度見つけることができます。NSManagedObjectわかりにくいことは承知していますが、これがとそのNSManagedObjectID特性のポイントです。

(とそのオブジェクトがどのように機能するかを理解していない場合はCoreData、答えに反対票を投じることはありません。無意味な反対票の代わりに、より多くのドキュメントを読んでください。)

更新#2

@NickLockingのコメントによると、上記の私の答えの太字部分を拡張します。

NSManagedObjectContext 新しいクラスとまだ保存されていないクラスのを保存する までNSManagedObject は、一時的に一意のIDのみがあります。最初に保存された後、永続的な一意のIDを取得します。

于 2012-07-19T08:48:03.953 に答える
3

最終的にこれを行う良い方法はないと判断したので、awakeFromInsert で UUID を適用する uniqueIdentifier フィールドを作成しました。

オブジェクトを保存すると、アプリケーションの他の部分、特に NSFetchedResultsControllers が、オブジェクトの処理が完了する前に更新されます。コンテキストを保存せずにオブジェクト ID を取得すると考えて、NSManagedObjectContext の acquirePermanentObjectIds:withError: メソッドを簡単に試してみましたが、実際には単にコンテキストを保存するだけです。

于 2012-07-20T03:54:46.977 に答える
1

CoreDataによって自動的に提供される唯一の一意の識別子はオブジェクトIDですが、お気づきのとおり、最初に作成された後に変更されます。ただし、これを回避する別の方法を考え出す前に、管理対象オブジェクトクラスで次のようなものを定義することを検討することをお勧めします。

- (NSManagedObjectID *)permID {
    if ([[self objectID] isTemporaryID]) {
        // Save myself, returning nil if there are errors
    }
    return [self objectID];
}

このアプローチは決して完璧ではありません。特に、オブジェクトが有効でデータベースに保存できる状態になる前に永続IDを公開する必要がある場合はそうです。ただし、オブジェクトを保存する前に永続IDを必要としない限り、一貫した方法で永続IDを公開できます。

于 2012-07-19T15:51:32.927 に答える