PDM Avanzado FireBase Datos Sincronizados na nube

De MediaWiki
Ir a la navegación Ir a la búsqueda

Introdución

  • FireBase é unha plataforma xestionada por Google que permite, entre outras vantaxes, dispoñer dunha API para gardar e sincronizar datos na nube en tempo real.
  • Podemos ver neste enlace os prezos e características para os diferentes plans.
No caso do plan gratuíto, dispoñemos entre outras características, de:
  • 1GB de almacenamento.
  • 200 conexión simultáneas.
  • 10GB ao mes de descarga.
  • Podemos consultar neste outro enlace os límites anteriores tamén os límites a nivel de programación das coleccións que emprega FireBase para gardar información.



Tipos de bases de datos

  • Permite dous tipos de bases de datos:
  • Realtime Database é a base de datos orixinal de Firebase.
  • Tipo de almacenamento: árbore json
  • As bases de datos se limitan á disponibilidade zonal nunha soa rexión
  • O escalamiento necesita fragmentación (se aumentamos o número de conexións ou escrituras por segundo necesitamos dividir a información en varias bases de datos)
  • Cloud Firestore é a opción mais nova cunha serie de vantaxes con respecto a opción anterior, coma:
  • Tipo de almacenamento: Base de datos NoSQL orientada aos documentos. Coleccións de documentos.
Os datos complexos e xerárquivos son máis doados de organizar e escalar. Emprega subcoleccións dentro dos documentos
Permite realizar consultas sobre os datos con filtros máis complexos.
  • As bases de datos son aloxadas en diferentes servidores de diferentes rexións.
  • O escalamiento non necesita fragmentación.


  • No caso de base de datos RealTime Database emprega arquivos json para gardar os datos, polo que teremos que ter coidado coa forma de gardar a información para acceder a ela da forma correcta.
Imaxinemos que temos un chat e queremos gardar esta información (exemplo obtido deste enlace):
 1 {
 2   "chats": {
 3     "one": {
 4       "title": "Historical Tech Pioneers",
 5       "messages": {
 6         "m1": { "sender": "ghopper", "message": "Relay malfunction found. Cause: moth." },
 7         "m2": { ... },
 8         // a very long list of messages
 9       }
10     },
11     "two": { ... }
12   }
13 }


Fixarse que a nivel de EE/R <=> relacional, os datos terían a relación de:
  • 1 CHAT (id,título) => N MENSAXES (m1,m2,...)
  • 1 PARTICIPANTE (nome) => N MENSAXES (Cada mensaxe é enviado por un participante do chat)
  • PARTICIPANTE <=> CHAT (un participante pode participar en múltiples chats)
Se na organización json anterior queremos obter o título de todos os chats teríamos que descargar a árbore completa (cando obtemos unha referencia a un nodo en Firebase, temos que descargar todo o que colga del) incluído todas as mensaxes.
Para evitalo poderíamos optar pola seguinte organización:
 1 {
 2   // Chats contains only meta info about each conversation
 3   // stored under the chats's unique ID
 4   "chats": {
 5     "one": {
 6       "title": "Historical Tech Pioneers",
 7       "lastMessage": "ghopper: Relay malfunction found. Cause: moth.",
 8       "timestamp": 1459361875666
 9     },
10     "two": { ... },
11     "three": { ... }
12   },
13 
14   // Conversation members are easily accessible
15   // and stored by chat conversation ID
16   "members": {
17     // we'll talk about indices like this below
18     "one": {
19       "ghopper": true,
20       "alovelace": true,
21       "eclarke": true
22     },
23     "two": { ... },
24     "three": { ... }
25   },
26 
27   // Messages are separate from data we may want to iterate quickly
28   // but still easily paginated and queried, and organized by chat
29   // conversation ID
30   "messages": {
31     "one": {
32       "m1": {
33         "name": "eclarke",
34         "message": "The relay seems to be malfunctioning.",
35         "timestamp": 1459361875337
36       },
37       "m2": { ... },
38       "m3": { ... }
39     },
40     "two": { ... },
41     "three": { ... }
42   }
43 }


Como podemos observar a organización é parecida a ter un modelo relacional, xa que temos as entradas cos CHATS, as entradas cos PARTICIPANTES e as entradas coas MENSAXES.
Loxicamente dita organización pode variar en función das necesidades de consulta de información.



Creación do proxecto FireBase

Nota: Analytics é unha ferramenta de Google para obter informes sobre o uso do noso sitio web ou como no caso de aplicacións Web, permite rexistrar eventos que se produzan dende a nosa aplicación (teremos que programar dito rexistro na aplicación móbil). Por exemplo, seleccionar un produto dunha lista sería un bon evento para rexistrar.




Proxecto Android

  • Temos que crear un proxecto Android cun MinSDK API 16 (Jelly Bean) ou superior.
  • Deberemos empregar a versión de Gradle 4.1 ou superior.
  • Os emuladores onde fagamos as probas teñen que ter unha imaxe con Google Play.



  • Como estamos a empregar unha base de datos de tipo Cloud Firestore, debemos seguir estes pasos.



https://firebase.google.com/docs/firestore/manage-data/add-data#update_elements_in_an_array


ERROR => Caused by: java.lang.IllegalStateException: Default FirebaseApp is not initialized in this process es.cursoandroid.cifprodolfoucha.localizaciongpscliente. Make sure to call FirebaseApp.initializeApp(Context) first.

Solución (a versión pode que teña que ser distinta):

Build.gradle(Project)

1 buildscript {
2     
3     repositories {
4         google()
5         jcenter()
6     }
7     dependencies {
8         classpath 'com.android.tools.build:gradle:3.4.1'
9         classpath 'com.google.gms:google-services:4.2.0'


Build.gradle(app)

 1 dependencies {
 2     implementation fileTree(include: ['*.jar'], dir: 'libs')
 3     implementation 'com.android.support:appcompat-v7:28.0.0'
 4     implementation 'com.google.android.gms:play-services-maps:16.1.0'
 5     testImplementation 'junit:junit:4.12'
 6     androidTestImplementation 'com.android.support.test:runner:1.0.2'
 7     androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
 8     implementation 'com.google.firebase:firebase-database:16.1.0'
 9     implementation 'com.google.firebase:firebase-firestore:19.0.2'
10     implementation 'com.android.support:recyclerview-v7:28.0.0'
11     implementation 'com.android.support.constraint:constraint-layout:1.1.3'
12     implementation 'com.android.support:design:28.0.0'
13     implementation 'com.google.code.gson:gson:2.8.0'
14 }
15 
16 apply plugin: 'com.google.gms.google-services'



https://firebase.google.com/docs/firestore/query-data/listen?hl=es-419



-- Ángel D. Fernández González -- (2019).