私はこの課題に約1週間苦労してきましたが、まだ適切な解決策を見つけることができていません. 私の課題はこれです:
任意のキーと値のペアのプロパティ リストを含む JSON モデルがあります。つまり、キーと値のペアはコンパイル時には不明です。モデルが事前に定義されている限り、JSON をモデル化して Core Data に格納するのは非常に簡単ですが、キーの名前と値の型がわからない場合、物事はすぐに困難になります。私の場合、これが私が直面している現実です。
私のモデルは次のようになります。
{
knownKey1:knownType1,
knownKey2:knownType2,
properties:{
someKey1:someType1,
someKey2:someType2,
}
}
理想的には、これらの任意のキーと値のペアをストアで直接検索できるようにする必要があります。コア データの任意の属性およびコア データの関係をフィルター処理するために NSPredicate を使用するにはどうすればよいですか?で説明されているアプローチと同様のアプローチに従って、それを行うことができます。NSPredicates でサブクエリを使用する。
このアプローチに従って、「プロパティ」エンティティとの対多関係を持つ「オブジェクト」エンティティのようなものがあります。
Object <--->> Property
プロパティには、「キー」と「値」の 2 つの属性があります。
Property
key : someKey
value : someValue
これにより、Core Data の JSON オブジェクトのプロパティ リスト内で任意のキーを効果的にモデル化し、永続化できます。そして、次のようなサブクエリを使用して、これらのキーと値のペアに基づいて取得できます (ブラウザーで記述されている、コンパイラーがないなど)。
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"SUBQUERY($properties, $element, $element.key == %@ AND $element.value == %@) != 0", someKey, someValue];
ここまでは、「キー」と「値」のタイプがわかっている限り、すべて問題ありませんでした。キーは常に文字列であり、値も常に文字列に制限する場合は、問題ありません。これで終わりです。オブジェクト/プロパティの関係があり、任意のキーを文字列値に関連付けて、ストレージ内のこれらに基づいて検索できます。
ただし、ソリューションをもう少し柔軟にしたいと思います.String、Int、Bool、Dateをサポートしたいと思います。これらは通常JSONにあり、コアデータにも型として存在しますが、見つけることができませんでしたこれには良いアプローチです。たぶん、私が見逃しているものがありますか?
私の最初のアプローチは、Object との関係を持つ Property 抽象エンティティを持ち、StringProperty、NumberProperty などの親になることでした。キーは Property で定義され、値はいずれかの子で定義されます。つまり、StringProperty で値の文字列を入力できます。 NumberProperty の Integer16 などですが、Property は値を定義しないため、これは機能しません。したがって、Property/Object 関係の一般的なレベルで検索を実行することはできません。
私は現在、Parent/Child 構造を取り除き、StringProperty と NumberProperty を作成し、それぞれが Object と関係を持つようにすることを検討しています。つまり、Object は StringProperty と対多の関係を持ち、NumberProperty と対多の関係を持つことになります. これは非常にエレガントではありませんが、おそらくこの実装をインターフェースのどこかに隠すことができるでしょう。
私はこの解決策が本当に好きではありませんが、これが私が今行くことを考えているルートです。私が考えたその他のこと: 変換可能な属性ですが、これらはストレージ内で検索できません。また、検索をすべてまとめてストレージにドロップし、プロパティ リストの JSON 文字列を保存して、要求に応じてそれを NSDictionary に変換するだけですが、これは最後の手段と考えています。
何か提案はありますか?木には見えないアプローチがあるかもしれません。