2012-01-28 8 views
0

学習プロジェクトでは、ユーザーが画像をキャプチャしてタグ付けできるアプリを構築しています。 CoreDataを使用してイメージとタグの名前を保存しています。このアプリでは、最初に、そのタグを持つ画像の数がすべてのタグを行サブタイトルとしてリストするUITableを表示します。ユーザーが写真を撮って1つ以上のタグでタグ付けできるアプリの別の部分があります。写真を撮ってタグを付けることはうまくいくようです。私はデータベースを見て、すべてが適切であることを見ることができます。iPhoneなぜ新しく挿入されたデータだけが私のUITableViewでfetchedResultControllerに関連付けられて表示されますか?

問題は、初めてアプリケーションを入力するときです。データベースに画像があるにもかかわらず、UITableViewに何も表示されません。アプリケーションを開いた後、写真を撮ってタグを付けると、UITableViewに表示され、画像カウントにはそのタグが付いたデータベースのすべての画像が反映されます。新しく追加された画像によって参照されない他のタグは表示されません。別の画像を撮り、他の画像に関連付けられたタグを追加すると、新しいタグがUITableViewに表示され、画像カウントにはそのタグを含むすべての画像が反映されます。それは、アプリケーションがデータベース全体ではなく、見たデータ(キャッシュ??)のみを認識していると考えられます。

どのようなコードが最も関連性が高いのかよく分かりませんが、私はfetchedResultsControllerをUITableViewにどのように取り付けるのかという問題が関係していると思われます。私は、ビューをレンダリングする前に、これはと呼ばれていることが確認できました

-(void) setupFetchedResultsController 
{ 
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Tag"]; 
    request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)]]; 

    MyAppDelegate *appDelegate = (MyAppDelegate*)[[UIApplication sharedApplication] delegate]; 
    NSManagedObjectContext *managedObjectContext = [appDelegate.imagesDatabase managedObjectContext]; 
    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext: managedObjectContext sectionNameKeyPath:nil cacheName: nil]; 
} 

:ここでのviewDidLoad関数で呼び出される関数のコードです。誰かが何が起こっているのか光を当てることができますか?

+0

問題の原因を突き止めました。上記の関数が、データベースのオープンが完了したときに呼び出される成功ハンドラ(UIManagedDocument openWithCompletionHandlerなど)の中で呼び出されていることを確認する必要があります。コードの後半で単に呼び出すか、成功ハンドラ内で切り替えられたBOOLを使用するだけでは十分ではありませんでした。 – codesweat

答えて

0

コードでは、レコードを取得していません。

アップルのコードテンプレートで提供されているUIFetchedResultsControllerのパターンを使用する必要があります。基本的には、フェッチされた結果コントローラを「遅延して」インスタンス化します。便利にはnilに設定し、更新されたデータで新しいフェッチを実行するなど、それ自体を再作成します。

-(NSFetchedResultsController*) fetchedResultsController { 
    if (fetchedResultsController_ != nil) { 
     return fetchedResultsController_; 
    } 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    [fetchRequest setEntity:[NSEntityDescription entityForName:@"Tag" inManagedObjectContext:self.managedObjectContext]]; 
    [fetchRequest setFetchBatchSize:20]; 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; 
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
    [fetchRequest setSortDescriptors:sortDescriptors]; 
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil]; 
    self.fetchedResultsController = aFetchedResultsController; 
    NSError *error = nil; 
    if (![aFetchedResultsController performFetch:&error]) { 
     NSLog(@"Error in fetchedResultsController : %@", error); 
    } 
    return aFetchedResultsController; 
} 

あなたが見ることができるように、このコードは、あなたのビューコントローラでこれらの性質を持っている必要があることを意味しますmanagedObjectContextfetchedResultsController。コントローラをインスタンス化するときに、アプリケーションデリゲートの管理オブジェクトコンテキストへの参照を取得します。

Xcodeで新しいプロジェクトを開始し、「マスター詳細」を選択し、「コアデータを使用」にチェックを入れて完全なテンプレートを取得します。

+0

お返事ありがとうございます。私は、データベースが正常に開かれる前にfetchedResponseControllerが実行されていることを設定した私のコードであるという問題を特定することができました。それが実行されることを保証することは、successHandlerが "yes"の成功で呼び出された結果としてのみコードを呼び出すことでした。 – codesweat

+0

私はこれが助けてくれることを願っています。もしそうなら、上のチェックマークをチェックしてください。 – Mundi

0

NSFetchedResultsControllerを使用する必要があるかどうかは疑問です。

あなたが何かやることができなかった理由は何らかの理由がある:

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Tag"]; 
request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)]]; 

MyAppDelegate *appDelegate = (MyAppDelegate*)[[UIApplication sharedApplication] delegate]; 
NSManagedObjectContext *managedObjectContext = [appDelegate.imagesDatabase managedObjectContext]; 
NSArray *fetchResults = [managedObjectContext executeFetchRequest:request]; 

をそして、ちょうどあなたのテーブルを移入することができtableViewControllerでその配列を使用するには..?

私はもう助けてもらえればいいと思っています。

+0

お返事ありがとうございます。 NSFetchResultsControllerの理由は、データベースとUITableViewとの同期を「自動化」するためです。たとえば、(同じManagedObjectContextを使用して)バックグラウンド操作がある場合、テーブルは自動的に新しいデータで更新されます。 NSFetchedResultsコントローラーを使わずにテストしてもらえれば、私の根本的な問題につながりました(上記参照)。再度、感謝します。 – codesweat

関連する問題