2017-08-04 10 views
1

私はイベントリストアプリを作成しています。イベント>パート>ステップの階層構造を持っています。私はイベントを作成した後、イベントに「入る」ことができ、「ステップ」のリストを含む「パーツ」のリストを見ることができます。Firebaseデータベースの更新で子データが削除されています

私のデータベースを構成した方法は、イベントとその詳細を表示するためにユーザーIDでソートされたオブジェクトを持っているため、そのイベントをクリックすると、今度はpartsオブジェクト。パーツオブジェクトは次のようになります。

parts: 
    eventID1: 
     partID1: 
      startDateTime:value, 
      endDateTime:value, 
      title:value, 
      ... 
     partID2: 
      startDateTime:value, 
      endDateTime:value, 
      title:value, 
      ... 
     etc. 

これはうまくいく、私はイベントIDごとにすべての部分を引っ張る。問題にはステップがあります。私が部品にステップを追加すると、それを2つの場所に入れます(updateを使用)。ステップテーブルに1つ、部品自体の1、新しいキーの追加:

steps: 
    eventID1: 
     partID1: 
      stepID1: 
       title:value, 
       startDateTime:value, 
       etc. 
      stepID2: 
       title:value, 
       startDateTime:value, 
       etc. 

そして最後に(問題領域)一部のオブジェクトは次のとおりです。手順はオブジェクトpart

に値が次のようになりますこのように見えるように更新:

parts: 
    eventID1: 
     partID1: 
      startDateTime:value, 
      endDateTime:value, 
      title:value, 
      ... 
      steps: 
       stepID1: 
        title:value, 
        startDateTime:value, 
        etc. 
       stepID2: 
        title:value, 
        startDateTime:value, 
        etc. 
     partID2: 
      startDateTime:value, 
      endDateTime:value, 
      title:value, 
      ... 
     etc. 

私は(updateを使用して、再び)上記の部品内のステップを追加しました。問題は、パートのタイトルや日付を編集するときです。更新されたものとして返されますが、そこにはステップがありません。ステップを消去します。基本的に

eventpartstepは同じ構造を有しているので、私は(イオン3/angular4を使用して)単一の関数にこのすべてを合わせてきた

update(action, type, eid, pid, sid, title, location, startDateTime) { 
    console.log("Firebase Database Receiving: ", action, type, eid, pid, sid, title, location, startDateTime); 
    let key = (action === "add") ? this.ref.push().key : null; 
    console.log(key); 
    let update; 
    let object = { 
     startDateTime: startDateTime, 
     startDateTimeEpoch: moment(startDateTime).format("X"), 
     endDateTime: startDateTime, 
     endDateTimeEpoch: moment(startDateTime).format("X"), 
     title: title, 
     type: type, 
     roles: { 
     [this.firebaseAuthentication.uid]: "admin", 
     }, 
     location: { 
     title: location, 
     street: '', 
     city: '', 
     state: '', 
     zip: '', 
     timeZone: '' 
     }, 
    }; 
    if(type === "events"){ 
     key = (key) ? key : eid; 
     if(action !== "delete") { 
     update = { 
      ['events/' + key]: object, 
      ['roles/' + this.firebaseAuthentication.uid + '/' + key]: object 
     } 
     } else { 
     console.log("delete event", key); 
     update = { 
      ['events/' + key]: null, 
      ['roles/' + this.firebaseAuthentication.uid + '/' + key]: null, 
      ['parts/' + key]: null, 
      ['steps/' + key]:null 
     } 
     } 
    } else if(type === "parts") { 
     key = (key) ? key : pid; 
     if(action !== "delete") { 
     update = { 
/************ . Here is the update object . ***********/ 
      ['parts/' + eid + '/' + key]: object 
     } 
     } else { 
     update = { 
      ['parts/' + eid + '/' + key]: null, 
      ['steps/' + eid + '/' + key]: null 
     } 
     } 
    } else if(type === "steps") { 
     key = (key) ? key : sid; 
     if(action !== "delete") { 
     update = { 
      ['parts/' + eid + '/' + pid + '/steps/' + key]: object, 
      ['steps/' + eid + '/' + pid + '/' + key]: object 
     } 
     } else { 
     update = { 
      ['parts/' + eid + '/' + pid + '/steps/' + key]: null, 
      ['steps/' + eid + '/' + pid + '/' + key]: null 
     } 
     } 
    } 
    console.log(object, update); 
    return new Promise((resolve, reject) => { 
/**************** . Finally the actual update function ************/ 
     this.ref.update(update).then(success => { 
     resolve(success); 
     }, error => { 
     reject(error); 
     }); 
    }); 
    } 

これは反復特定action/type組み合わせ、スルーedit/partです。

私がfirebaseのupdate()について読んだことは、それが触れていないオブジェクト内のデータを破壊してはいけません。これはset()のように動作するはずですが、私はそれを明らかにしたくありません。

どのような考えですか?フランク?

+0

あなたはコードをたくさん貼り付けており、最小限のreproが役立つでしょう。最も重要なのは、スラッシュで区切られたパスに*のすべての特殊性*を入れなければならないということです。更新はキーレベルのすべてを上書きするので、全体を上書きしない限り、ネストされたオブジェクトは実行できません。 –

+0

@MichaelBleigh、はい、私は多くのコードを貼り付けましたが、それは(他の2つの更新ステートメントの他に)関係しています。更新に関しては、空の 'steps'アイテムをそのオブジェクトに入れると、そこにあるものを上書きしませんか? (その時点ですべてのステップにステップが含まれていて、ポイントをチェックするだけなのですばらしい例ではありません) – ntgCleaner

+1

私は 'update({'foo/bar':{baz: 'qux'、some: 'thing' }) 'foo/bar'の下のものはすべて上書きされます。代わりに 'update({'foo/bar/baz': 'qux'、 'foo/bar/some': 'thing'})'を実行する必要があります。私はそれが問題であるかどうかは分かりません。ソートするコードがあまりにも多く、時間がないからです。 –

答えて

1

私はあなたのコードから収集したものから、私が期待する(ドキュメンテーションではなく経験から)アップデート機能が働いています。私が言っていることは、それをオブジェクトに設定することによってキーを更新することは、それが正確に行うことで、渡されたオブジェクトにキー値を設定することです。例:

ユーザー:

  • NIK

    • 年齢:18
    • ID:1
  • ジョージ

    • 年齢:29
    • ID:2

LET OBJ = {年齢:24}。

呼び出し更新({nik:obj})は、実際にnikが指定したオブジェクトの値を持つように設定します(idを削除します)。正しい理由に立つ?まあfirebase更新について言うん:

あなたが他の子ノードを上書きすることなく、同時にデータベースの場所の複数の子に書き込みたい場合は、以下のように、あなたはupdateメソッドを使用することができます。

明確でないかもしれないのは、あなたが更新しているキー(ジョージ)と同じレベルの他の子ノードを意味するということです。

+0

私の実験は同じことを示しています。マイケルの上の嘲笑のコメントも同様です。あなたが正しいと思うのはちょっと奇妙に聞こえるが、それを指摘するのは意味をなさない。 firebaseには、編集中のオブジェクトの子ではなく、子ノードが最上位のアイテムです。それは今理解できる – ntgCleaner

関連する問題