2011-06-01 11 views
0

複数のテーブルビューを持つアプリケーションがあり、すべてのデータを取得するためにCore Dataを使用したいと思います。私は2つのエンティティを持っています - フリーザーとアイテム。最初のテーブルビューでは、私は冷凍庫を追加し、それは正しく保存されます。私は、アプリケーションを終了し、再オープンし、そこにあります。私はフリーザー(別のテーブルビューを開く)をクリックし、いくつかの項目を追加し、私は新しいセクション化テーブルビューでそれらを見ることができます。私は、私のアプリを終了し、それを再起動し、冷凍庫を参照してください、それをクリックし、項目はありません。複数のTableVIewsからコアデータを保存する

私は自分のmanagedObjectContextをappDelegateに持っており、すべてのビューを使用してそこから参照するので、複数のインスタンスを作成していません。ここで私はmanagedObjectContextと私のitemsArrayの両方、冷凍庫にアイテムを保存するために使用するコードは次のとおりです。ここで

Item *item = (Item *)[NSEntityDescription insertNewObjectForEntityForName:@"Item" inManagedObjectContext:[delegate managedObjectContext]]; 
    [item setFreezer:freezerName]; 
    [item setName:name]; 
    [item setQuantity:quantity]; 
    [item setSection:section]; 
    [item setAdded:added]; 
    [item setNotes:notes]; 

    NSError *error = nil; 
    if (![[delegate managedObjectContext] save:&error]) { 
     NSLog(@"Freezer info didn't save. Need to handle this."); 
    } 

    [items insertObject:item atIndex:0]; 

は私がのviewDidLoad内のアイテムを取得するためにItemViewControllerに使用したコードは次のとおりです。

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"freezer == '%@'", freezerName]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Item" inManagedObjectContext:[delegate managedObjectContext]]; 
    NSSortDescriptor *sorts = [[NSSortDescriptor alloc] initWithKey:@"section" ascending:NO]; 
    NSArray *sort = [[NSArray alloc] initWithObjects:sorts, nil]; 

    [request setSortDescriptors:sort]; 
    [request setEntity:entity]; 
    [request setPredicate:predicate]; 

    NSError *error = nil; 

    NSMutableArray *results = [[[delegate managedObjectContext] executeFetchRequest:request error:&error] mutableCopy]; 
    if(results == nil) { 
     NSLog(@"Error fetching results... need to handle"); 
    } 

    [self setItems:results]; 

    NSLog(@"items count:%d", [items count]); 

返されたアイテム数はゼロです。

私は完全に困惑していて、オンラインで検索したり、さまざまなことを試したりしていましたが、わかりません。もっとスマートなコーダーがいることは知っています。あなたの誰かが問題の内容を理解できることを願っています。

答えて

0

私のデータは正しく保存されていました。私は述語をコメントアウトした後に見ました。したがって、私の述語の構文は間違っていました。私はいくつかの検索を行なったし、私のために働いた、この記事を見つけた:

Querying Core Data with Predicates - iPhone

私は、[CD]を含んでおり、それが動作してLIKEを置き換え!

0

私は助け

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"freezer like %@", freezerName]; 

希望に述語を変更しようと思います!

+0

私はこの提案に感謝しますが、同じ結果が得られます。 –

0

たぶん、問題はあなたが

- viewDidLoad: 

方法でデータをロードすることです。ビューがロードされたときに呼び出されるのは1回だけなので、データの下位レイヤが変更されると、View Controllerはそれを認識しません。

あなたは

- viewWillAppear: 

方法にあなたのロードコードを移動したり、データストアの状態が変更されたという情報を広め、そのイベント時にテーブルビューをリロードする通知を紹介することができます。

おそらく、NSFetchedResultsControllerをデータソースとして使用するのは、データストアの変更を常に認識しているからです。そのクラスへの参照については、ドキュメントをチェックしてください。

+0

私はviewWillAppearにコードを移動しようとしましたが、同じ結果がありました。私は述語を削除することにしました。私のデータはうまくいきました。だから私はデータがそこにあることを知っている私はちょうど私の述語が動作していない理由を把握する必要があります。 –

関連する問題