1

次の前提といくつかの小さな問題がある単純なアプリケーションがあります。

  • 4 つのタブがあり、それぞれに異なる情報を表示するテーブル ビューと、同じビュー コントローラーにモーダルで移動するプラス ボタンがあり、ユーザーはアプリに情報を追加できます。
  • ユーザーはビュー コントローラーに名前、タイトル、日付、金額を追加し、保存を押すとコア データ テーブル ビューに保存されます。

最初のタブには、上記の情報 (名前、タイトル、日付、金額) のすべてがラベル付きのカスタム テーブル セルに表示されます。これはうまく機能します。

2 番目のタブには名前に関する情報のみが表示され、3 番目のタブにはタイトルのみが表示されます。このように、ユーザーは最初のタブにすべてを表示しますが、2 番目のタブには「名前」のみが表示され、その名前に関する情報を収集するために選択できます。

名前 (または日付またはタイトル) ごとにエントリが 1 つしかない場合、アプリは正常に機能しますが、2 つ目のエントリを追加すると、[名前] タブで重複します。

たとえば、John Smith のエントリが 1 つしかない場合、[名前] タブにはそのエントリが 1 つ表示され、そこに入ると、John の名前が付いているトランザクションのみが表示されます (この例では 1 つ)。場合)。すべて良い。

ただし、John の別のエントリ (スペルはまったく同じ) を追加すると、それは別のエントリとして扱われ、突然、[名前] タブに 2 つの John が表示されます。

コア データ モデルの属性に一意の ID を入れていませんが、これを行う必要がありますか、それとも述語を使用して、[名前] タブで「これが既に存在する場合は、2 回表示しないでください」と尋ねることができますか?バー?

どんな支援も大歓迎です!

編集:

Name タブの fetchRequest は次のとおりです。

- (NSFetchedResultsController *)fetchedResultsController
{
    NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
    if (_fetchedResultsController != nil)
    {
        return _fetchedResultsController;
    }

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Transaction" inManagedObjectContext:managedObjectContext];
    fetchRequest.entity = entity;
    NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"whoBy.name" ascending:NO];
    fetchRequest.sortDescriptors = [NSArray arrayWithObject:sort];    
    NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:nil];
    self.fetchedResultsController = theFetchedResultsController;
    _fetchedResultsController.delegate = self;
    return _fetchedResultsController;
}

ご覧のとおり、述語などはありません。私が欲しいのは、「名前が存在する場合は、2回追加しないでください」という簡単なチェックを名前テーブルビューに表示することです。これが理にかなっていると思いますか?

4

2 に答える 2

1

はい、次のように設定することで、個別の値のみが必要であることを CoreData に伝えることができます。

NSFetchRequest *request;
request.propertiesToFetch = [NSArray arrayWithObject:@"Name"];
request.returnsDistinctResults = YES;
request.resultType = NSDictionaryResultType;
...

ただし、データベースに 2 つの John を入れたくない場合は、結果をフィルター処理するよりも、そこに入れないようにすることをお勧めします。したがって、データを挿入するときは、そのエントリが既にあるかどうかを確認し、挿入しない場合は (そのレコードを更新するだけです)...

于 2013-11-15T09:37:48.967 に答える
1

NamesタブでテーブルをクエリしてTransactionsから、そのトランザクションを実行した人の名前を取得しているため、エントリが重複しています。John には 2 つのトランザクションがあるため、John の名前が 2 回表示されます。

次のようなことを試してください:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:managedObjectContext];
fetchRequest.entity = entity;
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO];
fetchRequest.sortDescriptors = [NSArray arrayWithObject:sort];

このように、すべての名前 (人) を一度だけ取得する必要があります (名前とトランザクションの関係が 1 対多であると仮定します)。

編集:を作成するたびにTransaction、次の 2 つのことが発生する可能性がありPersonます。

  • それは new である可能性がありPerson、新しいエンティティを作成する必要があります。また、
  • 新品Personです。

ロジックは次のようなもので、コードを理解する必要があります。

  1. ユーザーが を追加するときは、Transactionそれが新しい人向けか既存の人向けかを確認する必要があります。既存の人であれば、リストから選択できる可能性がありますPersons(そして、人を選択すると、その人を取得します)。NSManagedObjectID)。新規の場合はその場で作成します。

  2. オブジェクトを作成したら、オブジェクトをその関係Transactionに追加する必要があります。Person私が正しく見た場合、あなたはオブジェクトにwhoBy関係を持っていTransactionます. Person手順 1 で取得したオブジェクトに設定します。

  3. オブジェクトの他のすべてのフィールドTransaction(金額など) を設定します。

  4. すべてが終わったら保存しますNSManagedObjectContext

現時点でコードで行っていることは、新しいPersonfor every を作成するTransactionことです。これが、同じ名前の複数のエントリが表示される理由です。

于 2013-11-15T09:30:34.973 に答える