2

短い:任意のオブジェクト(要素のメンバーシップだけでなく、要素の順序一意性を決定する)の一意の不変配列(固定長ですが、実行時に選択されます)を保持するキーによってコアデータオブジェクト
を見つける必要があります。ただし、NSManagedObjectはオーバーライドを禁止します。それで? [isEqual:]


ロング:
コアデータモデルにエンティティ(エンティティ「…リンク」の図の画像を参照)があり、属性キー(「タプル」)に基づいて一意性を保証する必要があります。ここまでは順調ですね。

ただし、エンティティの一意の属性はNSArrayである必要があります。
そして、物事をもう少し難しくするために、私はタプルの要素のクラスタイプも知りません。 また、タプルの要素数もわかりません。実際、カウントはすべてのタプルで同じです(少なくともコアデータコンテキストごと)が、アプリが実行される前はわかりません。

特定のタプルを持つリンクエンティティのインスタンスは1つだけでなければなりません。 そして明らかな理由で、任意のオブジェクトの特定の配列を持つタプルインスタンスは1つだけです。一方、が返さ れる場合、2つのタプルは等しいと見なされます。 NSManagedObjectは、オーバーライドを禁止しますが、それ以外の場合は、物事はかなり簡単になります。

[tuple_1 isEqual:tuple_n]YES[isEqual:][hash]

「…Tuple」オブジェクトは、トークンの配列とともに(便利なメソッドを介して)作成され、不変です(したがって、各「…Token」とそのデータ属性も不変です)。(「…Tuple」を「…Link」の辞書キーと考えてください。)

「 …Tuple」は、「…TokenOrder」の「order」キーに基づいて、きちんと順序付けられたトークンの配列"- (NSArray *)tokens;"を返すを実装します。(タプルには最大5つの要素が含まれると予想されます。)

ただし、「…Link」オブジェクトは数万(場合によってはさらに多く)あると予想されます。これらのオブジェクトは、「タプル」属性に基づいて(頻繁に)検索する必要があります。

悲しいことに、私はそのようなシナリオの記事(解決策は言うまでもなく)を文献やウェブで見つけることができませんでした。

何か案は?

コアデータモデル

私がこれまでに思いついた可能な解決策は次のとおりです。

  1. 「…Tuple」に「」と呼ばれる別の属性を追加することにより、タプルで比較する要素の数が少なくなります。tupleHashこれは、オブジェクトの作成時に次の方法で事前に計算されます。スニペット1

  2. NSPredicateを使用して、一致するtupleHashのオブジェクトをクエリします(候補のリストをかなり絞り込みます)。

  3. 絞り込まれた候補リストで、指定されたタプルを特徴とする「…Link」を検索します。Snippet1

スニペット1:

NSUInteger tupleHash = [[self class] hash];
for (id token in self.tokens) {
    tupleHash ^= [token.data hash];
}

スニペット2:

__block NSArray *tupleTokens = someTokens;
NSArray *filteredEntries = [narrowedCandidates filteredArrayUsingPredicate:
  [NSPredicate predicateWithBlock: ^(id evaluatedObject, NSDictionary *bindings) {
    return [evaluatedObject.tuple.tokens isEqualToArray:tupleTokens];
}]];

(申し訳ありませんが、マークダウンはリストとコードスニペットの混合に反対しているようです。)

良いアイデアですか、それとも非常識ですか?

前もって感謝します!

4

2 に答える 2

1

オブジェクトのハッシュを計算し、それをデータベースに保存することを強くお勧めします。2 番目のスニペットは、パフォーマンスに深刻な影響を与えることは間違いありません。

アップデート:

NSArray のハッシュ メソッドを使用する必要はありません。ハッシュを計算するには、連結された配列値に対して SHA1 または MD5 を実行できます。ハッシュには多くのアルゴリズムがありますが、これらは 2 つだけです。

myHashたとえば、コードを再利用可能にするために、NSArray のカテゴリを作成できます。

于 2011-01-17T16:12:26.103 に答える
0

Joe Blowのコメントで推奨されているように、私は SQLite を使用します。Core Data は、ここでは間違ったツールのようです。

利点:

  • SQL の列インデックスによる高速処理
  • 結果を返す前に、SELECT でオブジェクトの割り当て/初期化を行いません。(Core Data が属性チェックに必要とするもの)
  • JOIN を使用してリンク タプルを簡単にクエリします。
  • SQLite の JOIN、GROUP BY、ORDER BY などを簡単に使用
  • EGODatabase ( FMDBにインスパイアされたSQLite Objective-C ラッパー) のおかげで、ラッパー コードはほとんどまたはまったくありません。
于 2011-01-19T01:04:05.917 に答える