1

Core Data の関係および/または重複の処理方法を理解していることを確認しようとしています。

以下の例では、エンティティ Account がエンティティ Transaction Date との対多関係にあります。1 つのアカウントの下に複数の日付があるため、多くのことを考えています。

私が混乱しているのは、特定の日付を1つだけにしたいということです...つまり、日付は1つだけで、重複はありません。その意図は、エンティティ Transaction Date をエンティティ Event との対多関係にすることです。したがって、アカウント XYZ の取引日は 2012 年 6 月 11 日で、エンティティ イベントの複数のエントリがあります。次に、アカウント XYZ の取引日は 2012 年 6 月 12 日で、エンティティ イベントの複数のエントリがあります。

Account と Trans Date の関係は本当に対多または対 1 ですか? 対多の場合...重複はどのように処理されますか? エンティティ Trans Date に 1 つの日付のみを保持するにはどうすればよいですか? 私のコードが Event と Trans Date へのエントリによって追加されている場合、何らかの処理がそこで行われますか? どのように?

Account to Trans Date は 1 対 1 である必要があると思いますが、現時点ではよくわかりません。

/-----------------------\          /----------------------\       /------------------\
| Account               |          | Transaction Date     |       |   Event          |
|-----------------------|          |----------------------|       |------------------|
| name                  |          | addDate              |       |  amount          |
| balance               |          |                      |       |                  |
|-----------------------|          |----------------------|       |------------------|
| heldByAcct            | <-\      |                      |       |                  | 
|                       |     \->> | inAcct               |       |                  |
|                       |          | heldByEvent          |<-\    |                  |
\-----------------------/          \----------------------/   \->>| inTrans          |
                                                                  \------------------/
4

2 に答える 2

1

あなたが何を達成しようとしているのか理解できませんが、いくつか提案をさせていただきます。

初め

Accountが1つしか持てない場合はTransaction Date、1対1の関係を設定する必要があると思います。このようにして、あなたは人がとその逆Accountを持っていることを確信していTransaction Dateます。背後で、Core Dataはデータベースをセットアップして、テーブルに対応するオブジェクトAccountのIDのフィールドが含まれるようにします。Transaction Date

2番

チェックアウトメカニズムを設定していて、Account複数のトランザクション(たとえば、1日に1つだけ)を持つことができる場合は、1対多の関係を設定する必要があります。1日に1つのトランザクションをチェックする必要がある場合は、手動でチェックを実行する必要があります。Transaction Date特定の日付の述語を使用して要求を設定しAccount、カウントが1より大きいかどうかを確認します。いいえの場合は、それを追加しTransaction Dateます。

NSInteger count = [fetchRequest countForFetchRequest:&error]; // query against `Transaction Date`
if(count >= 1) // not allowed
else // allowed

通常、重複をチェックする必要がある場合は、エンティティの属性としてguidを使用します(たとえば、タイプのguid NSString)。だから、あなたTransaction Dateはそのようなメカニズムを使うことができます。次に、次のような述語を使用してフェッチ要求を設定できます。

[NSPredicate predicateWithFormat:@"guid == %@ AND inAcct == %@", @"12345", [self currentAccount]];

新しいものを挿入するたびに、日付(時間なし)と特定の日付(これを行うには独自のプロトコルを使用Transaction Date)に基づいて新しいGUIDを生成できます。Account

考えてみると、時間部分なしで日付を保存して確認することもできます(category-on-nsdate)。私はそれがうまくいくと思いますが、あなたは試す必要があります。これにより、GUIDなしで述語を使用できます。例えば:

[NSPredicate predicateWithFormat:@"addDate == %@ AND inAcct == %@", [self currentDate], [self currentAccount]];

それが役に立てば幸い。

于 2012-06-11T21:58:17.327 に答える
0

トランザクションレジスタをモデル化するには、addDateをEventのプロパティにし、TransactionDateを完全に削除することをお勧めします。

これにより、オブジェクトグラフを管理するために必要な作業が大幅に簡素化され、日付の重複を排除する必要がなくなります。

一意の日付のリストを作成する必要がある場合は、この質問への回答で説明されているように、distinctUnionOfSetsを使用してオンザフライで 作成できます。CoreDataは属性の個別の値を取得します

于 2012-06-12T17:55:38.853 に答える