Actualmente estoy haciendo un proyecto que usa Arduino para recopilar datos y almacenarlos en la nube y mostrar los datos en la nube en la aplicación móvil. Por lo que he intentado, Arduino solo puede cargar datos en la base de datos en tiempo real de Firebase, pero mi aplicación móvil Flutter necesita que los datos se almacenen en Firestore. ¿Hay alguna forma de escribir datos de la base de datos en tiempo real de firebase en Firestore automáticamente cuando hay cambios en la base de datos en tiempo real?
Esta es la estructura de la base de datos en tiempo real : estructura de la base de datos en tiempo real
y me gustaría agregar los datos en el campo respectivo en Firestore de esta manera: estructura de firestore
He intentado leer los datos cada 5 segundos y escribirlos en Firebase pero no parece muy eficiente:
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();Gracias.
¿Hay alguna forma de escribir datos de la base de datos en tiempo real de firebase en Firestore automáticamente cuando hay cambios en la base de datos en tiempo real?
Sí, un enfoque común es usar una función en la nube que se activa automáticamente cada vez que se agrega un nuevo nodo a la base de datos en tiempo real . La función de la nube se ejecuta en el back-end, es decir, en la infraestructura de Firebase/Google Cloud y, por lo tanto, no necesita escribir ningún código en su aplicación Flutter para esta duplicación/transferencia de datos.
Aquí hay un ejemplo simple con rutas genéricas:
// 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); });Te dejo hacer el trabajo de transformación del valor del nodo RTDB a la estructura del documento de Firestore que estás buscando.