如何使用Firebase Database存储和检索数组值?附代码求助
解决Firebase数据库中用户收听时长数组的更新问题
你的当前代码会直接用新数组[timearr]覆盖原有listen_track字段,而不是在现有数据基础上追加新的收听时长。以下是两种可行的解决方案:
方案1:读取现有数组后追加更新
先获取用户已有的listen_track数组,将新的时长数据追加进去,再整体更新字段:
function update() { calculateTime(lap); console.log("update"); var today = new Date(); var date = today.getFullYear() + '-' + (today.getMonth() + 1) + '-' + today.getDate(); var time = today.getHours() + ":" + today.getMinutes(); const userRef = database.ref('listener/' + mobile); // 一次性读取用户当前数据 userRef.once('value') .then(snapshot => { const userData = snapshot.val() || {}; // 初始化数组:如果没有listen_track字段则设为空数组 const existingTracks = userData.listen_track || []; // 追加新的收听时长数据 existingTracks.push(timearr); const updates = { code: code, date_db: date, time: time, mobile: mobile, listen_track: existingTracks }; return userRef.update(updates); }) .then(() => { alert('MANAN BHARNE KE LIYE CLICK KARE'); }) .catch(error => { console.error('更新失败:', error); }); }
注意:这种方式存在并发风险——如果多个客户端同时读取并更新,可能会覆盖彼此的修改。
方案2:使用Firebase Push ID存储列表(推荐)
Firebase官方推荐用唯一键值对替代传统数组存储列表数据,避免索引冲突和并发问题。通过push()方法自动生成唯一ID,将每条收听时长作为独立条目存储:
function update() { calculateTime(lap); console.log("update"); var today = new Date(); var date = today.getFullYear() + '-' + (today.getMonth() + 1) + '-' + today.getDate(); var time = today.getHours() + ":" + today.getMinutes(); const userRef = database.ref('listener/' + mobile); // 更新基础用户信息 userRef.update({ code: code, date_db: date, time: time, mobile: mobile }); // 向listen_track添加新条目,push()自动生成唯一ID userRef.child('listen_track').push(timearr) .then(() => { alert('MANAN BHARNE KE LIYE CLICK KARE'); }) .catch(error => { console.error('添加收听时长失败:', error); }); }
这种方式下,listen_track会变成一个对象,结构类似:
"listen_track": { "-NxYabc123": "时长数据1", "-NxYdef456": "时长数据2" }
后续读取时,可以通过遍历对象的键来获取所有收听时长条目。
内容的提问来源于stack exchange,提问作者Anmol Vani
相关产品推荐
相关产品推荐

