web-dev-qa-db-ja.com

コアデータの主キー

これはばかげているように思えるかもしれませんが、xcdatamodelファイルで属性を主キーとしてマークする方法を理解できませんでした。私の永続ストレージはsqliteファイルです。誰も私を助けることができますか?

その場合、IDを一意に「検証」するにはどうすればよいですか?検証メソッドなどを作成する必要がありますか?

75
Mugunth

オプションは次のとおりです。

  • -[NSManagedObject objectID]を使用します。このIDは、オブジェクトが初めて保存されるか、-[NSManagedObjectContext obtainPermanentIDsForObjects:error:]を呼び出すまで一時的なものです。
  • CFUUID関数ファミリを使用して、-awakeFromInsertメソッドの各オブジェクトのUUIDを生成します
  • モデルに整数を保存し、各オブジェクトの作成でそれをインクリメントする独自のプライマリキーのようなシステムを作成します

プロパティが一意であることを検証する良い方法はありません。最も近い方法は、作成時に一意であることを確認してから、IDを変更するユーザーを停止するカスタムセッターメソッドを実装することです。

87
Mike Abdullah

Core Dataはデータベースではなく、オブジェクトグラフ永続フレームワークであることを忘れないでください。主キーのようなものは、永続ストアの実装に依存するため抽象化されます。

43

Core Dataは独自の主キーを作成します-追加する必要はありません。あなたはそれを取得することができます

NSManagedObjectID *moID = [managedObject objectID];
20
Paul Tomblin

ハッキングするときに、主キーの実際のintが必要になる場合があります。これをつかむ方法は次のとおりです。

NSManagedObjectID *yourManagedObjectID = [yourManagedObject objectID];
int yourManagedObject_PK = [[[[[yourManagedObjectID URIRepresentation] absoluteString] lastPathComponent] substringFromIndex:1] intValue];

coreDataはオブジェクトグラフですが、CoreDataが生成したSQLiteデータベースデータを見ると、NSManagedObjectの主キーを取得するこの方法は問題になりません。 ii同じコードでCoreDataと低レベルsqlite3 Cライブラリを一緒に使用し、レコードを取得するためにCoreDataからsqlite3に主キーを渡すことはうまく機能します。

!このコードを実稼働環境で使用する場合は、db主キーがURIRepresentationに変換される方法に内部的な変更が生じる可能性があることに注意してください。コードが破損する可能性があります。

楽しい

14
kitschmaster

NSManagedObjectIDをハッキングすることなく、リモートデータコレクションを管理する前に属性の高速チェックを実行できます。

ユーティリティメソッドを作成しました ここで確認してください

0
danielemm