NSPredicateクラス

2011. 05. 07
●概要

NSPredicateクラスは、フェッチまたはインメモリのフィルタリングのどちらかの、検索を制限するために使用される、論理条件の定義に使用されます。

述語は論理条件の記述に使用し、永続ストア内のオブジェクトの記述や、インメモリのオブジェクトのフィルタリングに使用されます。

通常はNSComparisonPredicateや、NSCompoundPredicateNSExpressionのインスタンスから直接述語を生成しますが、多くの場合NSPredicateのクラスメソッドによって解析されたフォーマット文字列から述語を生成します。

述語のフォーマット文字列の例を以下に示します。
  • 単純な比較は、grade == "7" または firstName like "Shaffiq"

  • 大文字/小文字や区別的発音符を区別しない検索は、name contains[cd] "itroen"

  • 論理演算は、(firstName like "Mark") OR (lastName like "Adderley")

  • Mac OS X v10.5以降では述語で『間』を生成できます、date between {$YESTERDAY, $TOMORROW}
以下のように、関係の述語を生成することができます。
  • group.name like "work*"

  • ALL children.age > 12

  • ANY children.age > 12
@sum.items.price < 1000 のように、操作の述語を生成することができます。

完全な構文のリファレンスについては、『Predicate Programming Guide』を参照してください。

また、実行時に実際の値を代入する前に事前に定義できるように、変数を含んだ述語を生成することもできます。

Mac OS X v10.4では、変数を使った述語のために二段階の工程で評価します。
predicateWithSubstitutionVariables:evaluateWithObject:を参照)

Mac OS X v10.5以降では、evaluateWithObject:substitutionVariables:を使用し、これらの工程と組み合わせることができます。



●タスク

述語の生成

+ predicateWithFormat:
+ predicateWithFormat:argumentArray:
+ predicateWithFormat:arguments:
– predicateWithSubstitutionVariables:
+ predicateWithValue:
+ predicateWithBlock:

述語の評価

– evaluateWithObject:
– evaluateWithObject:substitutionVariables:

文字列表現の取得

– predicateFormat



●クラスメソッド

predicateWithFormat:

+ (NSPredicate *)predicateWithFormat:(NSString *)format, ...

指定したフォーマットで新しい文字列を生成し、解析した結果によって構成された新しい述語を生成して返します。

フォーマット文字列の書式と変数の代入での制限の詳細については、『Predicate Format String Syntax』を参照してください。

format:新しい述語のためのフォーマット文字列を指定します。

...:formatに代入する引数をコンマ区切りのリストで指定します。



●インスタンスメソッド



参考文献

NSPredicate Class Reference

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

NSFetchRequestクラス

2011. 05. 03
●概要

NSFetchRequestのインスタンスは、永続ストアからデータを取得ために使用する検索基準を記述します。

インスタンスは、永続ストア内に保持されているレコードに関するデータ、または管理オブジェクトのグループの選択(とオプションで順序)に必要な基準を収集します。

フェッチ要求には、検索するエンティティを指定するエンティティ記述(NSEntityDescriptionのインスタンス)が含まれている必要があります。

それらは頻繁に含まれます。
  • 述語(NSPredicateのインスタンス)は、例えば『姓が『J』で始まる』といった、選択するプロパティや選択上の制約を指定します。
    述語を指定しなかった場合、指定したエンティティの全てのインスタンスが選択されます。
    (他にも制約の条件はありますので、完全な詳細はexecuteFetchRequest:error:を参照してください)

  • ソート記述語(NSSortDescriptorのインスタンス)の配列は、例えば『姓の後に名を』といった、オブジェクトをどのような順序で返すかを指定します。
またフェッチ要求は、要求が返すオブジェクトの最大数や、要求がアクセスするデータの格納など、他の面も指定することができます。

Mac OS X v10.5以降では、フェッチが返すものが管理オブジェクトか単なるオブジェクトIDか、オブジェクトが完全にそれらのプロパティを実装しているかに関わらず、指定することができます。
resultTypeincludesSubentitiesincludesPropertyValuesreturnsObjectsAsFaults参照)

Mac OS X v10.6以降とiOSでは更に、フェッチへのプロパティ、フェッチのオフセット、フェッチが実行されている時の管理オブジェクトコンテキスト内にある現在未保存の変更に対する照合などを指定することができます。
resultTypepropertiesToFetchfetchOffsetincludesPendingChanges参照)

またCore Data Snippetsで説明されているように、与えられた関数を満たす異なったプロパティ値や属性値をフェッチすることもできます。

NSFetchRequestオブジェクトは、NSManagedObjectContextで定義されているメソッドexecuteFetchRequest:error:で使用します。

頻繁に管理オブジェクトモデル内のフェッチ要求を事前定義するには、名前によって格納されたフェッチ要求を取得するAPIが、NSManagedObjectModelから提供されています。

格納されたフェッチ要求は、変数を置換するためのプレースホルダが含まれていて、以降の完成品のためのテンプレートとして利用できます。

フェッチ要求のテンプレートはしたがって、実行時に置換される変数で、事前定義することができます。



●タスク

エンティティ

– entity
– setEntity:
– includesSubentities
– setIncludesSubentities:

フェッチ制約

– predicate
– setPredicate:
– fetchLimit
– setFetchLimit:
– fetchOffset
– setFetchOffset:
– fetchBatchSize
– setFetchBatchSize:
– affectedStores
– setAffectedStores:

並べ替え

– sortDescriptors
– setSortDescriptors:

プリフェッチ

– relationshipKeyPathsForPrefetching
– setRelationshipKeyPathsForPrefetching:

返される結果の管理

– resultType
– setResultType:
– includesPendingChanges
– setIncludesPendingChanges:
– propertiesToFetch
– setPropertiesToFetch:
– returnsDistinctResults
– setReturnsDistinctResults:
– includesPropertyValues
– setIncludesPropertyValues:
– returnsObjectsAsFaults
– setReturnsObjectsAsFaults:



●インスタンスメソッド

setEntity:

- (void)setEntity:(NSEntityDescription *)entity

レシーバのエンティティを設定します。

entity:レシーバのエンティティを指定します。


setPredicate:

- (void)setPredicate:(NSPredicate *)predicate

レシーバの述語を設定します。

predicate:レシーバの述語を指定します。



●定数



参考文献

NSFetchRequest Class Reference

NSPersistentStoreクラス

2011. 05. 02
●概要

このクラスは、全てのCore Data永続ストアのための抽象基本クラスです。

Core Dataは『Persistent Store』で説明されている、4つのストア型(SQLite、バイナリ、XML、インメモリ(XMLストアはiOSで利用できません))を提供します。

Core Dataはまた、NSPersistentStoreやNSAtomicStoreのサブクラスを提供します。

バイナリとXMLストアは、NSAtomicStoreから機能を継承したアトミックストアの例です。


サブクラス化の注意

NSPersistentStoreを直接サブクラス化すべきではありません。

Core Dataは現在、NSAtomicStoreのサブクラス化のみサポートしています。

指定イニシャライザはinitWithPersistentStoreCoordinator:configurationName:URL:options:です。

イニシャライザを実装する際は、初期化中にメタデータの読み込みをし、setMetadata:を使用して設定を確認する必要があります。

また、以下のメソッドをオーバーライドする必要があります。

type
metadata
metadataForPersistentStoreWithURL:error:
setMetadata:forPersistentStoreWithURL:error:



●タスク

永続ストアの初期化

– initWithPersistentStoreCoordinator:configurationName:URL:options:

状態情報の処理

– type
– persistentStoreCoordinator
– configurationName
– options
– URL
– setURL:
– identifier
– setIdentifier:
– isReadOnly
– setReadOnly:

メタデータの管理

+ metadataForPersistentStoreWithURL:error:
+ setMetadata:forPersistentStoreWithURL:error:
– metadata
– loadMetadata:
– setMetadata:

組立と分解

– didAddToPersistentStoreCoordinator:
– willRemoveFromPersistentStoreCoordinator:

移行のサポート

+ migrationManagerClass



●クラスメソッド



●インスタンスメソッド

persistentStoreCoordinator

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator

読み込んだレシーバの永続ストアコーディネータを返します。



参考文献

NSPersistentStore Class Reference






Bose QuietComfort 20
Calendar
04 | 2011/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

Bose QuietComfort 20
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