2016-07-31 4 views
3

私はRestaurantというRealmオブジェクトを私のアプリケーションに持っています。このRestaurantオブジェクトには、Tableオブジェクトが多数接続されています。私が保存した場合、それは次のようになります。今Realmオブジェクトが既に存在するかどうかをチェック

Restaurant *restaurant = [[Restaurant alloc] init]; 
restaurant.url = [_userData url]; 
restaurant.type = [_userData kind]; 

for (int i = 0; i < [[_userData tables] count]; i++) { 
    Input *input = [[_userData tables] objectAtIndex:i]; 
    Table *table = [[Table alloc] init]; 

    table.title = input.title; 
    table.seats = input.seats; 
    table.type = input.type; 

    [restaurant.tables addObject:table]; 
} 

RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration]; 
config.fileURL = [NSURL URLWithString:[Preferences getRealmPath]]; 
RLMRealm *realm = [RLMRealm realmWithConfiguration:config error:nil]; 

[realm beginWriteTransaction]; 
[realm addObject:restaurant]; 
[realm commitWriteTransaction]; 

、私が欲しいのレストランを追加しましたが、それはすでにその構成に存在しているとき、それは保存されていないということです。しかし、同じレストランを追加したときに、何かが違う - たとえそれが1テーブルの座席の量であっても、追加する必要があります。これを達成する最良の方法は何ですか?

答えて

2

レルムはprimary keysという名前のものをサポートしています。これは問題に適しているようです。

主キーは、Realmオブジェクトの一意の識別子です。整数または文字列にすることができます。あなたの場合、URLをプライマリキーとして使用することができます(各レストランが実際には1つのURLにのみ関連付けられている場合)。または、プライマリキーとして機能する新しいプロパティを追加します(おそらくnameフィールド)。

メソッドの代わりにaddOrUpdateObject:メソッドを使用できます。このメソッドは、主キーを持つオブジェクト型に対してのみ機能します。

  • Restaurantが以前レルムに加え、に対する変更されていない場合は、次のレルムは次のいずれかを行うだろう、あなたはRestaurantモデルタイプの主キーを設定すると仮定すると、あなたの場合は

    、あなたの新しいモデル、何も変わることはありません。

  • 以前にRestaurantがレルムに追加されていてもモデルが変更されている場合は、レルムの既存のモデルが更新されます。
  • Restaurantがレルムに以前に追加されていない場合は追加されます。

希望するものがあります。

+0

私は主キーについて知っていて、私はそれらを考えました。 *しかし*、ユーザーはデータを入力できるので、テーブルのみが変更されたレストランのインスタンスが複数存在する可能性があります。これらはすべて保存する必要があります。それは完全な1対1のマッチであるときには格納しないでください。 – user4992124

+0

その場合、URL、タイプ、およびテーブルの数を持つすべての 'Restaurant'のレルムで[クエリ](https://realm.io/docs/swift/latest/#filtering)したいと思うでしょうあなたが追加したい新しい「レストラン」として。そのクエリの 'Results'が空の場合、新しいモデルを追加するだけです。それ以外の場合は、各結果の 'Table'を繰り返し処理し、等価性をチェックすることができます(おそらく、そのクラスの' isEqual: 'をオーバーライドする必要があります)。結果がモデルと同一のテーブルを持たない場合は、追加することができます。 – AustinZ

+0

それはかなりリソース集中です、そうではありません。もっと良い方法がないかどうか本当に知りたいです。 – user4992124

0

解決策は、値をハッシュする主キーを作成することです。適度にユニークなデータからハッシュを作成する。たとえば、レストランの名前とテーブル名をハッシュします。

次に、ヒットしたレストランを含むハッシュ値ごとにバケットを設定する必要があります。

新しく入力したレストランに既存のハッシュがない場合は、バケットに追加するだけで済みます。そうでない場合は、一意性をテストするためにバケット内の既存のレストランと一致するかどうかを確認する必要があります。

関連する問題