Firebase实时数据库中如何写入第二个子树节点?
解决Firebase Realtime Database多子树写入与读取问题
一、写入第二棵子树(Color节点)
根据你的数据库结构,分两种场景处理:
场景1:Color是与Rides同级的独立子树
如果数据库结构为:
- 根节点 - Rides - userId - pushId1: { 骑行数据 } - pushId2: { 骑行数据 } - Color - userId - pushId1: { 颜色数据 }
写入Color的逻辑和Rides完全一致,仅需修改路径:
Button( onTap: () { if (_validateDate() == true) { // 写入原有Rides子树 ref.child('Rides/${user.uid}').push().set({ 'title': _titleController.text, // 其他骑行相关字段 }); // 写入Color子树 ref.child('Color/${user.uid}').push().set({ 'color': '红色', // 替换为你的颜色数据 // 其他Color相关字段 }); _titleController.clear(); } }, ),
注意:
set()返回Future,无需调用asStream(),如需监听结果可使用.then()或await
场景2:Color是Rides下每个自动节点的子节点
若希望每个骑行节点直接包含Color数据,结构如下:
- Rides - userId - pushId1 - title: "骑行标题" - Color: { color: "红色" }
直接在同一个set()中嵌套Color数据即可:
ref.child('Rides/${user.uid}').push().set({ 'title': _titleController.text, // 其他骑行字段 'Color': { 'color': '红色' } });
二、读取Color节点数据
你的读取问题源于变量命名混淆和路径错误,修正如下:
对应场景2的读取(Color在骑行节点内)
修改_getDBRides()中的变量名避免冲突,直接从快照提取Color:
_getDBRides() { return Expanded( child: FirebaseAnimatedList( query: dbRef, // dbRef需指向Rides/userId itemBuilder: (BuildContext context, DataSnapshot snapshot, Animation<double> animation, int index) { Map rideData = snapshot.value as Map; rideData['key'] = snapshot.key; // 读取Color数据 String color = rideData['Color']['color']; // 传递给列表项组件 return listItem(Rides: rideData, color: color); }, ), ); }
对应场景1的读取(Color是独立子树)
需根据骑行节点的pushId,单独查询Color子树下的对应节点:
_getDBRides() { return Expanded( child: FirebaseAnimatedList( query: dbRef, // dbRef指向Rides/userId itemBuilder: (BuildContext context, DataSnapshot snapshot, Animation<double> animation, int index) { Map rideData = snapshot.value as Map; String pushKey = snapshot.key; // 查询对应Color节点 ref.child('Color/${user.uid}/$pushKey').once().then((colorSnapshot) { if (colorSnapshot.exists) { Map colorData = colorSnapshot.value as Map; String color = colorData['color']; // 此处可更新UI状态,将Color数据传递给列表项 } }); rideData['key'] = pushKey; return listItem(Rides: rideData); }, ), ); }
内容的提问来源于stack exchange,提问作者Tiaan
相关产品推荐
相关产品推荐

