En aquest tema, explorarem les capacitats fora de línia de la base de dades en temps real de Firebase. Aquestes capacitats permeten que les aplicacions continuïn funcionant correctament fins i tot quan no hi ha connexió a Internet. Això és especialment útil per a aplicacions mòbils que poden experimentar connexions intermitents.

Objectius d'aprenentatge

  • Entendre com funciona la sincronització fora de línia en Firebase.
  • Aprendre a habilitar les capacitats fora de línia.
  • Gestionar dades fora de línia i sincronitzar-les quan es restableix la connexió.

  1. Introducció a les capacitats fora de línia

Firebase proporciona suport fora de línia per a la seva base de dades en temps real, el que significa que les aplicacions poden:

  • Continuar funcionant sense connexió a Internet.
  • Emmagatzemar dades localment fins que es restableixi la connexió.
  • Sincronitzar automàticament les dades locals amb el servidor quan es restableix la connexió.

  1. Habilitar les capacitats fora de línia

Per habilitar les capacitats fora de línia, cal configurar la base de dades en temps real perquè emmagatzemi dades localment. A continuació es mostra com fer-ho en diferents plataformes:

Android

// Habilitar la persistència fora de línia
FirebaseDatabase.getInstance().setPersistenceEnabled(true);

iOS (Swift)

// Habilitar la persistència fora de línia
Database.database().isPersistenceEnabled = true

Web (JavaScript)

// Habilitar la persistència fora de línia
firebase.database().ref().keepSynced(true);

  1. Lectura i escriptura de dades fora de línia

Quan la persistència fora de línia està habilitada, les operacions de lectura i escriptura es gestionen de la següent manera:

Lectura de dades

  • Les dades es llegeixen primer de la memòria cau local.
  • Si les dades no estan disponibles localment, es fa una sol·licitud al servidor.

Escriptura de dades

  • Les dades es guarden primer localment.
  • Quan es restableix la connexió, les dades es sincronitzen automàticament amb el servidor.

Exemple en Android

DatabaseReference myRef = FirebaseDatabase.getInstance().getReference("missatges");

// Escriure dades
myRef.setValue("Hola, món!");

// Llegir dades
myRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        String missatge = dataSnapshot.getValue(String.class);
        System.out.println(missatge);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        // Gestionar errors
    }
});

  1. Sincronització de dades

Quan l'aplicació recupera la connexió a Internet, Firebase sincronitza automàticament les dades locals amb el servidor. Això inclou:

  • Enviar les dades que s'han escrit localment al servidor.
  • Actualitzar les dades locals amb els canvis del servidor.

  1. Consells i bones pràctiques

  • Gestionar conflictes de dades: Quan es restableix la connexió, poden sorgir conflictes de dades. És important gestionar aquests conflictes adequadament.
  • Optimitzar l'ús de la memòria cau: Habilitar la persistència fora de línia pot augmentar l'ús de la memòria. Assegura't de gestionar la memòria cau de manera eficient.
  • Provar en diferents condicions de xarxa: Prova l'aplicació en diferents condicions de xarxa per assegurar-te que les capacitats fora de línia funcionen correctament.

Exercici pràctic

Objectiu

Crear una aplicació simple que permeti als usuaris afegir i veure missatges, fins i tot quan no hi ha connexió a Internet.

Passos

  1. Configura Firebase a la teva aplicació.
  2. Habilita la persistència fora de línia.
  3. Crea una interfície d'usuari per afegir i veure missatges.
  4. Implementa la funcionalitat per afegir missatges a la base de dades.
  5. Implementa la funcionalitat per llegir missatges de la base de dades.

Solució

Android (Java)

// MainActivity.java
public class MainActivity extends AppCompatActivity {

    private DatabaseReference myRef;
    private EditText editTextMessage;
    private TextView textViewMessages;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Habilitar la persistència fora de línia
        FirebaseDatabase.getInstance().setPersistenceEnabled(true);

        myRef = FirebaseDatabase.getInstance().getReference("missatges");
        editTextMessage = findViewById(R.id.editTextMessage);
        textViewMessages = findViewById(R.id.textViewMessages);

        findViewById(R.id.buttonSend).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String message = editTextMessage.getText().toString();
                if (!message.isEmpty()) {
                    myRef.push().setValue(message);
                    editTextMessage.setText("");
                }
            }
        });

        myRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                StringBuilder messages = new StringBuilder();
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    String message = snapshot.getValue(String.class);
                    messages.append(message).append("\n");
                }
                textViewMessages.setText(messages.toString());
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                // Gestionar errors
            }
        });
    }
}

iOS (Swift)

// ViewController.swift
import UIKit
import Firebase

class ViewController: UIViewController {

    var ref: DatabaseReference!
    @IBOutlet weak var textFieldMessage: UITextField!
    @IBOutlet weak var textViewMessages: UITextView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Habilitar la persistència fora de línia
        Database.database().isPersistenceEnabled = true

        ref = Database.database().reference().child("missatges")

        ref.observe(.value, with: { snapshot in
            var messages = ""
            for child in snapshot.children {
                if let snapshot = child as? DataSnapshot,
                   let message = snapshot.value as? String {
                    messages += "\(message)\n"
                }
            }
            self.textViewMessages.text = messages
        })
    }

    @IBAction func sendMessage(_ sender: UIButton) {
        if let message = textFieldMessage.text, !message.isEmpty {
            ref.childByAutoId().setValue(message)
            textFieldMessage.text = ""
        }
    }
}

Resum

En aquest tema, hem après com habilitar i utilitzar les capacitats fora de línia de la base de dades en temps real de Firebase. Hem vist com les dades es poden emmagatzemar localment i sincronitzar-se automàticament quan es restableix la connexió a Internet. També hem implementat una aplicació simple per posar en pràctica aquests conceptes.

Curs de Firebase

Mòdul 1: Introducció a Firebase

Mòdul 2: Autenticació de Firebase

Mòdul 3: Base de dades en temps real de Firebase

Mòdul 4: Cloud Firestore

Mòdul 5: Emmagatzematge de Firebase

Mòdul 6: Missatgeria en el núvol de Firebase

Mòdul 7: Analítica de Firebase

Mòdul 8: Funcions de Firebase

Mòdul 9: Monitoratge del rendiment de Firebase

Mòdul 10: Laboratori de proves de Firebase

Mòdul 11: Temes avançats de Firebase

© Copyright 2024. Tots els drets reservats