2017-03-18 2 views
1

私はfirebaseデータベースに次のような構造を持っている:アップデート同じフィールドを

"profiles": { 
    "user_id" : { 
     "id_profile_1" : { 
      "photos" : ".." 
      "selected" : "0" 
     }, 
     "id_profile_2" : { 
      "photos" : ".." 
      "selected" : "0" 
     }, 
     ... 
    } 
} 

は、一度にすべての子供たちにすべて同時に「選択」フィールドを更新する方法はありますか?

私はこれ作ってるんだ:

let ref = FIRDatabase.database().reference() 
let post = ["selected": "-1"] 
ref.child("profiles").child("user_id").updateChildValues(post) 

をしかし、それは "user_idを" レベルで新しい子が追加されます。

ありがとうございます!明確にするために

UPDATE

、実際の構造は次のようになります。

"profiles": { 
    "AZWul77p47.." : { 
     "KeC9NCb4Kh..." : { 
      "photos" : ".." 
      "selected" : "1" 
     }, 
     "Kj4yZOd6aJ..." : { 
      "photos" : ".." 
      "selected" : "0" 
     }, 
     ... 
    } 
} 

、ユーザーがアプリで別のプロファイルを選択したとき1」に、このプロファイルの変更の「選択」他のすべては "0"になります。だからこそ私は1回の呼び出しで他のすべてのものを "選択済み"を "0"に更新したいのです。

+0

いいえ、あなたの現在のデータ構造を考えると、それは不可能です。 'selected'というプロファイルノード以外の親セクションを追加することができます。サブノードヘッダーに 'Selected_1'、 'Selected_2'などを指定することができます。その効率は、正確に「選択された」ということが何を意味するのか、そしてどれだけ多くの州が有するのかに依存します。ps:上のケースで 'selected = -1'を取ったので、私はこのアプローチに行きました。これは従来の意味ではかなり混乱しています – Dravidian

+0

@Dravidianが答えに感謝します。私は-1を例として使用しました。選択された属性の唯一の有効な値は "0"または "1"です。 –

答えて

0

短い回答はいいえです。

id_profileを繰り返し実行し、毎回updateChildコールを実行するか、データベースを再構成することができます。

頻繁に変更する場合は、を選択しての値を選択することをお勧めします。これらの子をすべて反復するのは高額になるからです。

更新:

唯一の1つの項目は、プロファイルで一度に選択できる場合は、(平ら)な構造を正常化することができます。それはちょうど、新たに選択した項目のIDで選択子を更新し、あなたに多くのスペースを比較的保存し、それが簡単には、ユーザーが異なる項目を選択するたびに

"selectedItems": { 
    "AZWul77p47.." : {    // profile id 
     "selected": "KeC9NCb4Kh..." // set it to the selected item id 
    }, 
    ... 
}, 
"profiles": { 
    "AZWul77p47.." : { 
     "KeC9NCb4Kh..." : { 
      "photos" : ".." 
     }, 
     "Kj4yZOd6aJ..." : { 
      "photos" : ".." 
     }, 
     ... 
    } 
} 

を選択し設定することになるだろう

+1

ありがとう、はい、私は別の場所に "選択"を移動するか、より良い構造を考えると思います。 –

+0

私はあなたがあなたが作った更新から後になっていると思う。私の答えを更新しました! :-) – ThunderStruct

+0

あなたが正しいです、それは私のユースケースにとって最高の構造です。ありがとう! –

0

これは、所有しているid_profileノードの数が分かっている場合は、マルチパス更新を使用して可能です。あなたは単純なforループを使うことができます - 私はあなたに以下の10個のid_profilesがあると仮定しています。

このようにして行われる同時更新は、すべての更新が成功するか、すべての更新が失敗するかのいずれかです。

var childUpdates = [String: Int]() 
let numberProfiles = 10 

for index in 1...numberProfiles { 
    childUpdates["/profiles/user_id/id_profile_\(index)/selected"] = -1 
} 
ref.updateChildValues(childUpdates) 

詳細はhereを参照してください。

+0

ありがとう、残念ながら私はプロファイルの数を知らないし、プロファイルの名前はランダムなIDです。私は答えを更新しました。 –

関連する問題