android - query - Conversión de la base de datos de Firebase a Cloud Firestore
get data from firebase android (3)
Dado que los modelos de datos son tan diferentes, no hay una manera automática de lograr esto. Tendrá que escribir su propio método en función de las necesidades de su aplicación.
La documentación proporciona una visión general de las diferencias.
Que todos ustedes obtengan buenas noticias sobre Cloud Firestore de Firebase .
Como quiero convertir mi Firebase Database a Cloud Firestore, ¿hay alguna manera simple de convertirlo?
Quiero pasar a Cloud Firestore.
Las dos bases de datos tienen modelos de datos totalmente diferentes. Por esta razón, actualmente firebase no ofrece una herramienta de migración automática, en muchos casos daría como resultado una estructuración de datos ineficiente.
En un futuro cercano publicarán una guía que detalla las mejores prácticas para los desarrolladores de RTDB que buscan usar Cloud Firestore, ¡así que cuidado con eso!
enlace fuente - grupo google firebase
Base de datos de Firebase Realtime : todos los datos de Firebase Realtime Database se almacenan como objetos JSON. Puede pensar en la base de datos como un árbol JSON alojado en la nube. A diferencia de una base de datos SQL, no hay tablas o registros. Cuando agrega datos al árbol JSON, se convierte en un nodo en la estructura JSON existente con una clave asociada. Puede proporcionar sus propias claves, como ID de usuario o nombres semánticos
Example
{
data: {
first: "foo",
last: "bar",
dob: 1993,
}
}
Cloud Firestore : - En Cloud Firestore, la unidad de almacenamiento es el documento. Un documento es un registro liviano que contiene campos, que se asignan a valores. Cada documento está identificado por un nombre. Un documento que represente a un usuario alovelace podría verse así:
document
first : "foo"
last : "bar"
dob : 1994
Una cosa más en Firerestore de la nube, el modelo de datos se almacena en la colección y el documento, y Realtime Database no tiene tales conceptos.
Me escribo a mí mismo guías mientras aprendo cosas nuevas. Aquí está mi guía que describe cómo migré mi base de datos en tiempo real a Cloud Firestore. Puede saltear la primera sección. Escribo en Markdown, algunas de las marcas de código no se traducen en el marcado de . Si tiene problemas para leerlo, le enviaré la versión original de Markdown. Ahora estoy trabajando para actualizar mis controladores a las consultas Cloud Firestore.
Migración de Firebase Realtime Database a Cloud Firestore
¿Por qué y por qué no Firebase Realtime Database?
Durante más de dos años, mi stack de partida ha sido Angular y Firebase. El enlace de datos me llamó la atención: si un usuario cambia los datos en la vista, los datos cambian instantáneamente en el controlador y en la base de datos de la nube. O cualquier otro orden de eventos. Mi primer proyecto de Firebase fue un juego de tres en raya donde dos jugadores podían jugar de forma remota, con mi clic apareciendo instantáneamente en su pantalla, y viceversa, con la actualización de la base de datos en la nube. (Firebase llama a esto "estados sincronizados entre clientes en tiempo real").
También me gusta la biblioteca de Auth de Firebase. Configurar el inicio de sesión de usuario de OAuth2 con Facebook, Google, Twitter, GitHub o un número de teléfono, o correo electrónico y contraseña de la vieja escuela, es fácil.
Me gusta no tener que lidiar con la configuración y el mantenimiento de un servidor.
Y me gusta usar una base de datos NoSQL. Utilizo matrices de objetos en JavaScript, ¿por qué no utilizar la misma estructura de datos en la base de datos?
No necesito esto, pero los desarrolladores de aplicaciones móviles pueden usar las capacidades fuera de línea de Firebase Realtime Database. Cuando el usuario está fuera del rango de servicio, la base de datos puede continuar actualizándose, de modo que cuando el usuario vuelva a estar en línea pueda acceder a los datos actuales.
Además, Firebase tiene almacenamiento para archivos binarios grandes, como imágenes, audio y video.
¿Qué no le gusta de Firebase Realtime Database? Las consultas Mi perro tiene tantas novias en el vecindario que necesito una base de datos para hacer un seguimiento de todas ellas. Quiero llamar a los propietarios de China para invitarla a una cita de juegos. Obtener su número de teléfono no es fácil. No puedo decirle a Firebase que mire en los marcadores, encuentre el objeto con un name
igual a China
y devuelva el campo phone_number
. Tengo que decirle a Firebase que descargue la matriz completa, luego ejecute un ciclo para cada ciclo para iterar sobre cada objeto, buscando el name === China
. Esto se denomina "consulta profunda" porque devuelve todos los objetos de la matriz, y cada subarreglo, y todos los subniveles anidados. ¡Mi perro tiene tantas novias que puede llevar unos segundos descargarlas todas!
Firebase Realtime Database tiene clasificación, por lo que puedo descargar la variedad de perros del vecindario ordenados por nombre, edad, etc. Puedo filtrar, por ejemplo, solo perros de más de cinco años, pero Firebase Realtime Database no puede ordenar ni filtrar.
La clave para encontrar un objeto específico en Firebase Realtime Database es conocer su clave. Las claves son objetos livianos que se parecen a -KloeQHDC-mugPjJMAG4
. Si realiza un seguimiento de la clave de un objeto, puede recuperar fácilmente el objeto de la base de datos. Por ejemplo, cuando un usuario nuevo inicia sesión con Facebook y crea un registro en la base de datos de Auth, y luego crea una cuenta de usuario en la base de datos en tiempo real, puede hacer que la clave de autenticación del usuario sea un par clave-valor en la cuenta del usuario para que puede encontrar fácilmente los datos de autenticación ( displayName
, photoURL
, etc.) asociados con este usuario.
Con una base de datos para Auth, otra para el almacenamiento de archivos binarios y una tercera base de datos para todo lo demás, tiene muchas claves para realizar un seguimiento.
Para proyectos de Big Data, Firebase Realtime Database tiene limitaciones adicionales. Los datos solo pueden anidar 32 capas de profundidad. Ampliar requiere sharding. Si su cliente está haciendo grandes cantidades de datos, o cree que sus 5000 registros son big data, tendrá que discutir para convencer a su cliente de que no use SQL en un servidor.
¿Por qué Cloud Firestore?
¿Por qué? Las consultas! Con Cloud Firestore ahora puedo consultar mi matriz de dogs
, solicitando el registro con el name
igual a China
. Firebase solo devuelve el objeto que quiero.
Cloud Firestore puede ordenar y filtrar datos.
Cloud Firestore puede manejar subcolecciones dentro de los documentos. Puede solicitar un documento que contenga subcolecciones de documentos y solo obtener el documento, sin sus subcolecciones. Es decir, consultas superficiales. Incluso puede eliminar un documento que contenga subcolecciones de documentos y conservar las subcolecciones.
Cloud Firestore también se escala mejor que Firebase Realtime Database. La seguridad es mejor y hay otras características y mejoras nuevas.
Inyectar dependencias
En primer lugar, debe agregar Cloud Firestore a su proyecto. En su archivo index.html
después de vincularse a la CDN de Firebase, enlace al CDN de Cloud Firestore:
<script src="https://www.gstatic.com/firebasejs/4.5.0/firebase.js"></script>
<script src="https://www.gstatic.com/firebasejs/4.5.0/firebase-firestore.js"></script>
O descargue el módulo Node y enlace a él:
npm install [email protected] --save
Si usa Firebase SDK en un servidor de nodo, también deberá agregar una dependencia:
const firebase = require("firebase");
// Required for side-effects
require("firebase/firestore");
También en index.html
necesitarás inicializar la aplicación:
firebase.initializeApp({
apiKey: ''### FIREBASE API KEY ###'',
authDomain: ''### FIREBASE AUTH DOMAIN ###'',
projectId: ''### CLOUD FIRESTORE PROJECT ID ###''
});
Si también está utilizando Firebase Realtime Database, Storage y Cloud Messaging, tendrá más cosas:
firebase.initializeApp({
apiKey: ''### FIREBASE API KEY ###'',
authDomain: ''### FIREBASE AUTH DOMAIN ###'',
databaseURL: "https://###.firebaseio.com",
messagingSenderId: "###",
projectId: ''### CLOUD FIRESTORE PROJECT ID ###'',
storageBucket: "###.appspot.com"
});
Y, finalmente, haga una referencia a Cloud Firestore en su controlador:
var db = firebase.firestore();
Migrando tus datos
A continuación, querrá migrar sus datos de Firebase Realtime Database a Cloud Firestore. Esto es facil.
return firebase.database().ref(''dogs'').once(''value'') // get a snapshot of the user''s data
.then(function(snapshot) { // then execute a promise on the snapshot
snapshot.forEach(function(childSnapshot) { // iterate through the user''s data
let childData = childSnapshot.val(); // this is the user''s data
db.collection(''dogs'').doc(childData.dog).set(childData); // each dog is written to Cloud Firestore
})
});
No hagas esto:
return firebase.database().ref(''dogs'').once(''value'') // get a snapshot of the user''s data
.then(function(snapshot) { // then execute a promise on the snapshot
db.collection(''dogs'').set(snapshot); // copy the array to Cloud Firestore
});
Este último copiará las claves de Firebase Realtime Database. Tampoco funcionará porque no puedes subir colecciones a Cloud Firestore, solo puedes subir documentos.
En el ejemplo anterior, el bucle forEach
recorre cada registro y lo carga como un documento a Cloud Firestore. La colección se crea automáticamente y se llama dogs
. Esto también elimina las claves de la base de datos de Firebase Realtime y las reemplaza con claves Cloud Firestore.
La return
detiene cualquier código que se ejecute después de este comando. Si desea migrar muchas matrices, use return
solo en el último comando:
firebase.database().ref(''dogs'').once(''value'') // get a snapshot of the user''s data
.then(function(snapshot) { // then execute a promise on the snapshot
snapshot.forEach(function(childSnapshot) { // iterate through the user''s data
let childData = childSnapshot.val(); // this is the user''s data
db.collection(''dogs'').doc(childData.dog).set(childData); // each dog is written to Cloud Firestore
})
});
firebase.database().ref(''cats'').once(''value'') // get a snapshot of the user''s data
.then(function(snapshot) { // then execute a promise on the snapshot
snapshot.forEach(function(childSnapshot) { // iterate through the user''s data
let childData = childSnapshot.val(); // this is the user''s data
db.collection(''cats'').doc(childData.cat).set(childData); // each cat is written to Cloud Firestore
})
});
return firebase.database().ref(''cetaceans'').once(''value'') // get a snapshot of the user''s data
.then(function(snapshot) { // then execute a promise on the snapshot
snapshot.forEach(function(childSnapshot) { // iterate through the user''s data
let childData = childSnapshot.val(); // this is the user''s data
db.collection(''cetaceans'').doc(childData.cetacean).set(childData); // each whale and dolphin is written to Cloud Firestore
})
});
Anidar datos en colecciones y documentos
Firebase Realtime Database le permite tener matrices en matrices, objetos en objetos, matrices en objetos u objetos en matrices. Cloud Firebase solo permite documentos (objetos) en colecciones (matrices) y colecciones en documentos. En otras palabras, los datos de Cloud Firebase siempre están estructurados como colección, documento, colección, documento, etc.
Tal vez quiera copiar una matriz anidada en una subcolección:
return firebase.database().ref(''dogs'').child(''girlfriends'').once(''value'') // get a snapshot of the user''s data
.then(function(snapshot) { // then execute a promise on the snapshot
snapshot.forEach(function(childSnapshot) { // iterate through the user''s data
let childData = childSnapshot.val(); // this is the user''s data
db.collection(''dogs'').doc(childData.word).set(childData); // write the data to Cloud Firestore
db.collection(''dogs'').doc(''dogs'').collection(''girlfriends'').doc(childData.dog).set(childData);
})
});
Aquí estamos obteniendo las girlfriends
array de los dogs
array, iterando a través de la matriz con forEach
ciclo, y escribiendo cada registro en una colección de girlfriends
en un documento dogs
en una colección de dogs
. Llamé tanto a la colección superior como a los dogs
documento superiores. Podrías usar diferentes nombres.
Actualizando el código
Ahora comenzaremos a actualizar nuestro código.
Actualización de referencias
Ya hemos actualizado una línea de código. Actualizamos nuestra referencia de Firebase Realtime Database:
let ref = firebase.database().ref();
a Cloud Firestore:
let db = firebase.firestore();
Puede dejar la referencia de Firebase Realtime Database por el momento, y luego comentarla o eliminarla cuando hayamos terminado.
Tengo otra referencia de Firebase Realtime Database para mi matriz de users
:
let users = firebase.database().ref(''users'');
Lo actualizaremos a:
let usersFS = firebase.firestore().collection(''users'');
Usaremos diferentes nombres para que podamos ejecutar ambas bases de datos juntas, hasta que hayamos terminado nuestra migración.
Actualización de consultas
Ahora podemos comenzar a actualizar nuestras consultas. En mi controlador, mi primera consulta firebase.database().ref
es:
firebase.database().ref(''userLoginEvent'').update({''user'': user.uid})
Para Cloud Firestore, en cambio usamos:
db.collection(''userLoginEvent'').doc(''HUSEj7dPh8xsOw32feQY'').update({''user'': user.uid});
El código es casi idéntico, excepto que Cloud Firestore requiere especificar un documento en una colección. Aquí hago referencia a la clave del documento porque este comando siempre escribe en la misma ubicación en la base de datos.
Luego, tengo:
firebase.database().ref(''users'').child($scope.userAccountKey).update(englishWords);
Lo actualizaremos a:
db.collection(''users'').doc($scope.userAccountKey).update(englishWords); // this isn''t working
¿Y quién en Marketing lo nombró Cloud FireStore?
¡Ese nombre es demasiado largo! Buscando nombres de dominio, veo que fire.me
todavía está disponible. Me pregunto por qué nadie en marketing sugirió ese corto y memorable nombre de dominio.