当前位置: 首页 > 知识库问答 >
问题:

如何将Firebase实时数据库自动写入Firestore?

郭知
2023-03-14

我目前正在做一个项目,该项目使用Arduino收集数据并将数据存储在云端,并将数据显示在移动应用程序的云端。从我尝试过的情况来看,Arduino只能将数据上传到Firebase实时数据库,但我的Flutter移动应用程序需要将数据存储在FiRest中。当实时数据库发生变化时,有没有办法将firebase实时数据库数据自动写入Fiback?

这是实时数据库结构:实时数据库结构

我想将数据附加到Firestore中的相应字段中,如下所示:firestore结构

我尝试过每5秒读取一次数据并将其写入Firebase,但似乎不是很有效:

final userDbRef = FirebaseDatabase.instance.ref("user/");
 String uid = globals.uid;

 Stream<DatabaseEvent> stream = userDbRef.onValue;

 // Subscribe to the stream!
 var subscription = stream.listen((DatabaseEvent event) {
   // print('Listening');
   dynamic values = event.snapshot.value;
   final data = new Map<String, dynamic>.from(values);

   globals.temp = data['temp'];
   globals.hr = data ['hr'];
   globals.spo2 = data['spo2'];
   globals.position = data['position'];
   globals.time = DateTime.parse(data['time']);
 });

 subscription.pause();

 String date = DateTime.now().add(const Duration(hours: 8)).toString().substring(0, 10);

 dynamic result = await DatabaseService(uid: uid).getUserData('patient');
 if (result[date].toString() == 'null') {
   await DatabaseService(uid: uid).updateSingleUserData('patient', {
     date: {
       'time': ['${date} 00:00:00.000'],
       'hr': [95],
       'temp': [36.5],
       'spo2': [98],
       'position': ['lying'],
     },
   });
 } else {
   List timeList = result[date]['time'];
   List hrList = result[date]['hr'];
   List tempList = result[date]['temp'];
   List spo2List = result[date]['spo2'];
   List positionList = result[date]['position'];

   if ((!timeList.contains(globals.time.toString())) & (globals.time.toString() != 'null')) {
     timeList.add(globals.time.toString());
     hrList.add(globals.hr);
     tempList.add(globals.temp);
     spo2List.add(globals.spo2);
     positionList.add(globals.position);

    await DatabaseService(uid:uid).updateSingleUserData('patient', {
       date: {
         'time': timeList,
         'hr': hrList,
         'temp': tempList,
         'spo2': spo2List,
         'position': positionList,
       },
     });
   }
 }
 subscription.resume();

谢谢。

共有1个答案

欧阳狐若
2023-03-14

有没有办法在实时数据库发生变化时,将firebase实时数据库数据自动写入Firestore?

是的,一种常见的方法是使用云函数,该函数在每次将新节点添加到实时数据库时自动触发。云功能在后端执行,即在Firebase/ Google Cloud基础架构上执行,因此您无需在Flutter应用程序中为此数据镜像/传输编写任何代码。

下面是一个包含通用路径的简单示例:

// The Cloud Functions for Firebase SDK to create Cloud Functions and set up triggers.
const functions = require('firebase-functions');

// The Firebase Admin SDK to access Firestore.
const admin = require('firebase-admin');
admin.initializeApp();


exports.duplicateToFirestore = functions.database.ref('/myRTDBPath/{pushId}')
    .onCreate((snapshot, context) => {
      // Grab the current value of what was written to the Realtime Database.
      const nodeVal = snapshot.val();

      // Write it to a Firestore collection

      return admin.firestore().collection('myFirestoreCollection').add(nodeVal);

    });

我允许您将RTDB节点值转换为您正在寻找的Firestore文档结构。

 类似资料:
  • 我有一个关于firebase实时数据库规则的问题。 有人创建了一个帐户,该帐户在实时数据库中创建了一个路径: 结构很简单(密钥、用户ID和其他数据)。 这是我的规则: 但现在问题来了。如何允许用户写入此对象?每个拥有代码的人(请参阅BQUyhq)w3D)都可以写入对象id。如果没有代码,他们就无法写入对象id。 有可能发生这样的事吗?如果是的话,我该怎么做呢。

  • 我设法将数据插入身份验证,但无法插入数据库: 代码: 错误: E/AndroidRuntime:致命异常:主进程:com。实例budgetingapp,PID:11507 java。lang.RuntimeException:在类androidx上找到了名称getText的冲突获取程序。appcompat。小装置。AppCompativeText位于com。谷歌。火基。消防商店。util。Cust

  • firebaseDatabase=firebaseDatabase.getInstandatabaseReference=firebaseDatabase.getReference()Query Query=databaseReference.child(“ticket_detail”).orderbychild(“ticket_no”).limittoLast(1);AddListenerFor

  • 我正在尝试用Firebase制作一个简单的Android应用程序。 目前,我只是试图从Firebase实时保存用户数据库。但由于某种原因它不起作用。另一方面,身份验证工作完美。 数据库本身没有显示任何内容。它总是显示“null” 我一直在关注这个YouTube教程,并一直在做一些类似的事情。 当我尝试创建一个用户并将其发送到数据库时,运行的程序没有给出任何答案。我有一个进度条,一旦setValue

  • 首先,我很抱歉我的英语,我希望你能理解。这是我的第一个android应用程序,我尝试使用Firebase进行身份验证和数据库。身份验证工作正常,但我不能读写实时数据库。以下是我的数据库规则和结构: 我试图将数据库中的数据添加到reclyclerview中,但我的代码止步于AddValueEventListener。然后我尝试添加一个简单的数据到数据库,但它也不起作用。我也尝试将相同的代码放入一个活