14

私のアプリでは、Core Data を使用しない追加の sqlite データベースと共に Core Data を使用しています。この追加のデータベースには、NSManagedObject各インスタンスの を介してインスタンスへの参照を格納する列がありますNSManagedObjectID

次のように、インスタンスobjectIdをストレージの文字列として取得しています。

instance.objectID.URIRepresentation.absoluteString

これにより、次のような文字列が得られます。

x-coredata://EE13EA1E-D5F4-4E38-986D-3F4B0B03AEE4/ClassName/p658

後で次のNSManagedObjectようにインスタンスをフェッチするために使用できます。

[persistentStoreCoordinator managedObjectIDForURIRepresentation:[NSURL URLWithString:uriString]];

これらの URI 文字列は冗長で冗長な情報が含まれているため、データベースのスペースを節約し、クエリのパフォーマンスを向上させるために、それぞれの独自の側面だけを保存したいと考えています。したがって、上記の例では、URI 文字列全体ではなく「658」だけです。

したがって、最初の質問は次のとおりです。 の一意の末尾だけを抽出する良い方法は何NSManagedObjectIDですか? 次に、それを保存したら、後でそれを使用してインスタンスをフェッチするにはどうすればよいでしょうか?

文字列操作は気持ち悪いので避けたいのですが、それしか方法がなければ検討します。私の唯一の混乱は、上記の例で「EE13EA1E-D5F4-4E38-986D-3F4B0B03AEE4」の部分がどこから来ているかです。有効な URI を再構築するためにその値にアクセスするにはどうすればよいですか?

4

1 に答える 1

17

大量のデータを含む属性に「外部ストレージを許可」フラグを設定してみてください。それにより、直接管理された別のデータベースが不要になるかどうかを確認できます。

それ以外の場合は をURIRepresentation返すNSURLため、「やっかいな」文字列操作は必要ありません。NSURLメソッドを使用するだけです。;^) 分解する方法は次のとおりです。

NSURL *instanceURL = instance.objectID.URIRepresentation;
NSURL *classURL = [instanceURL URLByDeletingLastPathComponent];
NSString *classString = [classURL absoluteString];
NSString *instanceId = [instanceURL lastPathComponent];

そして、後で元に戻す方法は次のとおりです。

NSURL *reconstructedClassURL = [NSURL URLWithString:classString];
NSURL *reconstructedInstanceURL = [reconstructedClassURL
    URLByAppendingPathComponent:instanceId];
NSManagedObjectID *objectID = [moc.persistentStoreCoordinator
    managedObjectIDForURIRepresentation:reconstructedInstanceURL];
NSManagedObject *reconstructedInstance = [moc objectWithID:objectID];

URIRepresentationは「アーカイブ可能」であると文書化されているため、Core Data から提供されたコンポーネントから再構築しても害はありません。Core Data は、分解して元に戻したことがわかりません。

ただし、Apple は、古い形式を受け入れ続けるURIRepresentation限り、返される形式を将来変更することができます。managedObjectIDForURIRepresentation:つまり、バラバラになった上記のコードは、いつか機能しなくなるURIRepresentation 可能性があります。

于 2013-03-12T07:43:19.103 に答える