NSEntityDescriptionクラス

2011. 05. 04
●概要

NSEntityDescriptionオブジェクトは、Core Data内のエンティティを記述するオブジェクトです。

エンティティと管理オブジェクトの関係はClassとidの関係と同じで、データベースとして使用する場合はテーブルと行の関係に類似しています。

インスタンスはエンティティの名前を指定し、(NSAttributeDescriptionとNSRelationshipDescriptionのインスタンスによって表される属性と関係の)プロパティとクラスで表します。

NSEntityDescriptionオブジェクトは、Core Dataフレームワークを使用するアプリケーション内の、永続ストアにあるエントリを表すために使用される、インスタンスの特定のクラスに関連付けられています。

最低限、エンティティ記述には次の要素が必要です。
  • 名前

  • 管理オブジェクトのクラス名
    (エンティティが管理オブジェクトのクラス名を持たない場合、デフォルトはNSManagedObjectになります)
通常は、Xcodeのデータモデリングツールを使用して、NSManagedObjectModelのエンティティを定義します。

NSEntityDescriptionオブジェクトは主に、アプリケーションの管理オブジェクトに永続ストアのエントリをマッピングするために、Core Dataフレームワークによって使用されます。

明確にモデルを処理する場合を除いて、直接対話する可能性はありません。

他の主要なモデリングクラスと同様に、NSEntityDescriptionはエンティティに関連付けられたアプリケーション固有の情報を格納することができるユーザ辞書を提供します。


エンティティ記述の編集

エンティティ記述は、オブジェクトグラフマネージャによって使用されるまで編集可能です。

これは動的に生成または編集することができます。

ただし、(対象となる管理オブジェクトモデルが永続ストアコーディネータに関連付けられ)一度使用された記述は変更してはいけません(実際は変更できない)。

これは実行時に適用されるので、モデルを永続ストアコーディネータに関連付けした後で、モデルまたはそのサブオブジェクトの変更を試みると、例外が発生します。

使用されてからモデルの変更を行う必要がある場合は、コピーを生成してコピーに変更を行い、それから古いモデルのオブジェクトを破棄してください。

エンティティの階層を生成する場合は、関連するAPIを考慮する必要があります。

エンティティのサブエンティティのみ設定することができますが(setSubentities:参照)、エンティティのスーパーエンティティを直接設定することはできません。

特定のエンティティのスーパーエンティティを設定するには、スーパーエンティティにサブエンティティの配列を設定し、配列内に現在のエンティティを含める必要があります。

したがって、エンティティ階層はトップダウンで構築する必要があります。


辞書内にあるエンティティ記述の使用

NSEntityDescriptionのcopyメソッドは次のようなエンティティを返します。

[[entity copy] isEqual: entity] == NO

NSDictionaryがコピーするキーと要求するキーの両方がNSCopyingプロトコルに準拠し、[[object copy] isEqual:object]がtrueの場合にcopyが返すオブジェクトのプロパティを持っている必要があるので、エンティティを辞書のキーとして使用しないでください。

代わりに、エンティティの名前をキーとして使用するか、コールバックを保持してマップテーブル(NSMapTable)を使用してください。


高速列挙

Mac OS v10.5以降とiOSでは、NSEntityDescriptionはNSFastEnumerationプロトコルをサポートしています。

エンティティのプロパティの列挙に使用する例を以下に示します。

NSEntityDescription *anEntity = ...;

for (NSPropertyDescription *property in anEntity) {

    // property is each instance of NSPropertyDescription in anEntity in turn

}



●タスク

エンティティ記述に関する情報

– name
– setName:
– managedObjectModel
– managedObjectClassName
– setManagedObjectClassName:
– renamingIdentifier
– setRenamingIdentifier:
– isAbstract
– setAbstract:
– userInfo
– setUserInfo:

継承の管理

– subentitiesByName
– subentities
– setSubentities:
– superentity
– isKindOfEntity:

プロパティの処理

– propertiesByName
– properties
– setProperties:
– attributesByName
– relationshipsByName
– relationshipsWithDestinationEntity:

指定した名前でのエンティティの取得

+ entityForName:inManagedObjectContext:

新しい管理オブジェクトの生成

+ insertNewObjectForEntityForName:inManagedObjectContext:

バージョン管理のサポート

– versionHash
– versionHashModifier
– setVersionHashModifier:

エンティティ記述のコピー

– copy



●クラスメソッド

entityForName:inManagedObjectContext:

+ (NSEntityDescription *)entityForName:(NSString *)entityName inManagedObjectContext:(NSManagedObjectContext *)context

指定した管理オブジェクトコンテキストの永続ストアコーディネータに関連付けされた管理オブジェクトモデルから、指定した名前のエンティティを返します。

このメソッドは以下のコード例と機能的に同等です。

NSManagedObjectModel *managedObjectModel = [[context persistentStoreCoordinator] managedObjectModel];

NSEntityDescription *entity = [[managedObjectModel entitiesByName] objectForKey:entityName];

return entity;

entityName:エンティティの名前を指定します。

context:使用する管理オブジェクトコンテキストを指定します。


insertNewObjectForEntityForName:inManagedObjectContext:

+ (id)insertNewObjectForEntityForName:(NSString *)entityName inManagedObjectContext:(NSManagedObjectContext *)context

指定した名前でエンティティのクラスのインスタンスを生成、構成をして返します。

戻り値は、entityNameで名付けられたエンティティのクラスのインスタンスを、新規に完全に構成して自動解放します。

インスタンスはエンティティ記述のセットを持ち、contextに挿入されます。

このメソッドは、管理オブジェクトの生成の詳細について心配すること無く、指定したエンティティのインスタンスを簡単に生成することができます。

メソッドはMac OS X v10.4で特に役立ち、エンティティを表すために使用するクラスを知らなくても、新規に管理オブジェクトの生成に使用することができます。

これはクラスとクラス名が揮発性の場合、初期の開発ライフサイクルにおいて特に有効です。

メソッドは、以下のコード例と概念的に類似しています。

NSManagedObjectModel *managedObjectModel = [[context persistentStoreCoordinator] managedObjectModel];

NSEntityDescription *entity = [[managedObjectModel entitiesByName] objectForKey:entityName];

NSString *className = [entity managedObjectClassName];

Class entityClass = [[NSBundle mainBundle] classNamed:className];

id newObject = [[entityClass alloc] initWithEntity:entity insertIntoManagedObjectContext:context];

return [newObject autorelease];


Mac OS X v10.5以降とiOSでは、エンティティのための適切なクラスのインスタンスを返す際に、initWithEntity:insertIntoManagedObjectContext:の代わりに使用することができます。

Mac OS X v10.5とiOSの同等なコードは以下のようになります。

NSManagedObjectModel *managedObjectModel = [[context persistentStoreCoordinator] managedObjectModel];

NSEntityDescription *entity = [[managedObjectModel entitiesByName] objectForKey:entityName];

NSManagedObject *newObject = [[NSManagedObject alloc] initWithEntity:entity insertIntoManagedObjectContext:context];

return [newObject autorelease];

重要:メソッド名に『new』という言葉が存在しますが、参照カウントの環境において、返されたオブジェクトを解放する責任はありません。
(『new』がメソッド名の最初の言葉ではないからで、『Memory Management Rules』を参照してください)

entityName:エンティティの名前を指定します。

context:使用する管理オブジェクトコンテキストを指定します。



●インスタンスメソッド



参考文献

NSEntityDescription Class Reference






QuietControl 30 wireless headphones
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
04 | 2017/05 | 06
Sun Mon Tue Wed Thu Fri Sat
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

Author:水月杏香
永遠の初心者プログラマ。

Wish List
WACOM


ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
BOSE

QuietControl 30 wireless headphones
Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
Amazon


OpenGL ES
SQLite
Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Visitors
QR Code
QR