私はイベントリストアプリを作成しています。イベント>パート>ステップの階層構造を持っています。私はイベントを作成した後、イベントに「入る」ことができ、「ステップ」のリストを含む「パーツ」のリストを見ることができます。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
を使用して、再び)上記の部品内のステップを追加しました。問題は、パートのタイトルや日付を編集するときです。更新されたものとして返されますが、そこにはステップがありません。ステップを消去します。基本的に
各event
、part
とstep
は同じ構造を有しているので、私は(イオン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()
のように動作するはずですが、私はそれを明らかにしたくありません。
どのような考えですか?フランク?
あなたはコードをたくさん貼り付けており、最小限のreproが役立つでしょう。最も重要なのは、スラッシュで区切られたパスに*のすべての特殊性*を入れなければならないということです。更新はキーレベルのすべてを上書きするので、全体を上書きしない限り、ネストされたオブジェクトは実行できません。 –
@MichaelBleigh、はい、私は多くのコードを貼り付けましたが、それは(他の2つの更新ステートメントの他に)関係しています。更新に関しては、空の 'steps'アイテムをそのオブジェクトに入れると、そこにあるものを上書きしませんか? (その時点ですべてのステップにステップが含まれていて、ポイントをチェックするだけなのですばらしい例ではありません) – ntgCleaner
私は 'update({'foo/bar':{baz: 'qux'、some: 'thing' }) 'foo/bar'の下のものはすべて上書きされます。代わりに 'update({'foo/bar/baz': 'qux'、 'foo/bar/some': 'thing'})'を実行する必要があります。私はそれが問題であるかどうかは分かりません。ソートするコードがあまりにも多く、時間がないからです。 –