0

CoreData モデルを作成し、エンティティと属性を定義しました。<NSFetchedResultsControllerDelegate> また、次のオブジェクトに準拠して追加したNSObject のクラス (dbInterface という名前) を作成しました。

NSFetchedResultsController *fetchedResultsController;
NSManagedObjectContext *managedObjectContext;

ここで私は非常に迷っています。作成された sqlite3 ファイルからデータを取得するにはどうすればよいですか?

私のクエリは、それが適切な用語である場合、条件に基づいてエンティティの 1 つから特定のレコードを選択する必要があります。CoreData でクエリなどを記述する方法がわかりません。

4

1 に答える 1

10

NSFetchedResultsControllerはおそらく必要ありません。結果コントローラーは通常、UITableViewControllerとともに、テーブルにデータを入力するためのヘルパーオブジェクトとして使用されます。

それが必要な場合は、続行します。ただし、コアデータコンテキストからエンティティを取得するだけの場合は、NSFetchRequestのみが必要です。Personというコアデータオブジェクトがあるとします。「ライアン」という名前のすべてのエンティティが必要だとしましょう

NSFetchRequest *fetch = [NSFetchRequest fetchRequestWithEntityName:@"Person"];

NSString *nameToGet = @"Ryan";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = %@", nameToGet];
[fetch setPredicate:predicate];

NSError *error = nil;
NSArray *results = [[self managedObjectContext] executeFetchRequest:fetch error:&error];
if(results) {
    NSLog(@"Entities with that name: %@", results);
    for(Person *p in results) {
        NSLog(@"person = %@", p);
    }
    return results;
} else {
    NSLog(@"Error: %@", error);
}

return nil;

したがって、フェッチ要求を作成します。NSPredicateは、SQLステートメントのwhere条件に似ています。したがって、フォーマットを使用して述語を作成します(述語を作成するためのオプションはたくさんあります)。リクエストの述語を設定してから、managedObjectContextにフェッチリクエストを実行するように指示します。リクエストの結果はすべて、返された配列に含まれます。配列内のすべてのオブジェクトは、Person型のオブジェクトになります。

NSFetchedResultsControllerの使用を検討している場合、それは基本的に同じタイプのものです。ただし、不変の1つのフェッチ要求を使用してコントローラーを作成するため、コントローラーは常に同じデータを取得します。別のデータが必要な場合は、別のコントローラーを作成する必要があります。NSFetchRequestsだけに固執する場合(私はUIからデータレイヤーを分離しているので、コントローラーを使用することはあまり役に立ちません)、必要なデータをクエリして結果を返すことができます。

于 2013-02-08T18:10:28.197 に答える