ちょっとした背景情報: Ruby on Rails Web サイトからデータを取得し、その json を解析して、オブジェクトを Core Data オブジェクトに割り当てています。これはうまく機能しており、重複をまだチェックしていないことを除いて、行は正常にインポートされています (まだ実装していません)。そのため、アプリを起動するたびに、余分な 3 つのオブジェクトが追加されます。
NSFetchedResultsController
モデルのすべてのオブジェクトを取得するようにセットアップしました。
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass([self class])];
request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"remote_id" ascending:YES]];
return [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:nil cacheName:nil];
テーブル コントローラーでは、FetchedResultsController からデータを取得するすべてのメソッドをテーブル デリゲート メソッドに追加しました。
問題自体は、NSFetchRequest
配列内のすべてのオブジェクトを取得すると (現時点では約 60 あります)、テーブルには 3 つの結果しか表示されないことです。私のRailsサーバーにある(偶然にも..?)同じ3つの結果。
データベースを手動で開き、いくつかの「重複」レコードを編集して、魔法の重複チェックを行っているかどうかを確認しましたが、手動で編集したレコードがまだ表示されていません。この時点で、私は迷っています。結果がフィルタリングされる原因は何ですか? コードは、そもそもこれらのモデルが重複していることを認識すべきではありません。わかりません。
編集 - -
より詳しい情報:
私の TableViewController は、ここでスタンドフォードから提供された CoreDataTableViewController のサブクラスです (付随するレクチャー ビデオは iTunes U で入手できますが、すばらしいものです): http://www.stanford.edu/class/cs193p/cgi-bin/drupal /downloads-2011-fall (CoreDataTableViewController.zip の場合は ctrl+f)
これはperformFetch
、fetchedResultsController プロパティ セッターに割り当てた後に処理し、単に呼び出します
NSError *error;
[self.fetchedResultsController performFetch:&error];
if (error) NSLog(@"[%@ %@] %@ (%@)", NSStringFromClass([self class]), NSStringFromSelector(_cmd), [error localizedDescription], [error localizedFailureReason]);
//...
[self.tableView reloadData];
セクション数と行数については (1 と 3 を返します):
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return [[self.fetchedResultsController sections] count];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [[[self.fetchedResultsController sections] objectAtIndex:section] numberOfObjects];
}
そして、cellForRowAtIndexPath
各オブジェクトを取得するために以下を呼び出すだけです
id myObject = [self.fetchedResultsController objectAtIndexPath:indexPath]
edit 2 ----- さて、ここに私が部品を選ぶのではなく、実際のコードがあります:
私の中でRegistration+sync.m
:
+ (NSFetchRequest*)requestForAll {
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass([self class])];
request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"remote_id" ascending:YES]];
return request;
}
+ (NSFetchedResultsController*)requestForAllResultsController {
NSFetchRequest *request = [self requestForAll];
NSManagedObjectContext *context = [DataController instance].database.managedObjectContext;
return [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:nil cacheName:nil];
}
+ (NSArray*)allObjects {
NSFetchRequest *request = [self requestForAll];
return [[DataController instance] fetch:request];
}
DataController で:
- (NSArray*)fetch:(NSFetchRequest*)request {
NSManagedObjectContext *context = self.database.managedObjectContext;
NSError *error = nil;
return [context executeFetchRequest:request error:&error];
}
TableViewController で:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
NSLog(@"rows: %d", [[[self.fetchedResultsController sections] objectAtIndex:section] numberOfObjects]);
NSLog(@"all objects: %d", [[Registration allObjects] count]);
return [[[self.fetchedResultsController sections] objectAtIndex:section] numberOfObjects];
}
以下を出力します。
2012-10-09 15:22:04.211 MyApp[8279:c07] rows: 4
2012-10-09 15:22:04.214 MyApp[8279:c07] all objects: 68