Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


¿Cómo lidiar con el modo fuera de línea Firebase y el empuje de datos?

Cuando se utiliza Firebase, se recomienda utilizar el comando push () para administrar la lista de datos. Eso está muy bien, proporciona un identificador único y ordenado para los datos insertados en la lista.

Sin embargo, cuando Firebase se desconecta (goOffline o NetworkOffline), si la aplicación intenta insertar datos en una lista, el oyente de finalización no se activará hasta que la aplicación vuelva a estar en línea: no hay identificación única hasta que la línea vuelva a estar conectada. .

1 / ¿Es eso el comportamiento esperado / normal?

2 / No vi en el documento (por lo que recuerdo), que el comando de empuje está funcionando de manera diferente (o sólo en línea) en estado fuera de línea. ¿He perdido una línea en algún lugar?

3 / Mi caso de uso se ocupa de los datos que poseen la relación. Significa que quiero crear un objeto (tipo de maestro) en una lista, y reutilizar este ID de objeto maestro (proporcionado por el oyente de terminación) para construir la relación entre el objeto maestro y todos los demás objetos pertinentes. ¿Cómo puedo manejar este estado fuera de línea?

Ejemplo de código:

findViewById(R.id.button3).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new Firebase(getString(R.string.firebase_url)).child("stack").push().setValue(counter++, new Firebase.CompletionListener() { @Override public void onComplete(FirebaseError firebaseError, Firebase firebase) { ((TextView) findViewById(R.id.textView3)).setText(String.valueOf(counter) + " - " + firebase.toString()); } }); } }); 

Editar

Aquí hay 4 formas de agregar datos:

Empuje con el oyente

  findViewById(R.id.button3).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new Firebase(getString(R.string.firebase_url)).child("stack").push().setValue(counter++, new Firebase.CompletionListener() { @Override public void onComplete(FirebaseError firebaseError, Firebase firebase) { ((TextView) findViewById(R.id.textView3)).setText(String.valueOf(counter) + " - " + firebase.toString()); } }); } }); 

SetValue con Listener

  findViewById(R.id.button4).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new Firebase(getString(R.string.firebase_url)).child("stackManual").child(UUID.randomUUID().toString()).setValue(counter++, new Firebase.CompletionListener() { @Override public void onComplete(FirebaseError firebaseError, Firebase firebase) { ((TextView) findViewById(R.id.textView4)).setText(String.valueOf(counter) + " - " + firebase.toString()); } }); } }); 

SetValue sin escucha

  findViewById(R.id.button5).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Firebase temp = new Firebase(getString(R.string.firebase_url)).child("stackManual").child(UUID.randomUUID().toString()); temp.setValue(counter++); ((TextView) findViewById(R.id.textView5)).setText(String.valueOf(counter) + " - " + temp.getKey().toString()); } }); 

Empujar sin escuchar

  findViewById(R.id.button6).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Firebase temp = new Firebase(getString(R.string.firebase_url)).child("stack").push(); temp.setValue(counter++); ((TextView) findViewById(R.id.textView6)).setText(String.valueOf(counter) + " - " + temp.getKey().toString()); } }); 

¡APARECE QUE LOS ESCUCHADORES SON DISPARADOS SOLAMENTE CUANDO LOS DATOS ESTÁN EN LA BASE DE DATOS EN EL SERVIDOR, Y NO EN EL DB LOCAL! – ES ESO CORRECTO ? – ¿ESTÁ DOCUMENTADA?

Debido a que sabiendo que, una aplicación asíncrono directa es más difícil de construir ahora: encapsulación de trabajo asincrónico no se puede realizar si fuera de línea, ¿verdad?

  • ¿Puedo almacenar archivos de imagen en firebase usando Java API?
  • Android Firebase - No se puede recibir correctamente JSON de la instantánea de Firebase
  • Clasificación de datos de Firebase en Android
  • Error de generación de token Google Cloud Messaging (GCM) después de la actualización de Google Play Services relacionada con Firebase
  • Firebase y el nuevo inicio de sesión de Google en Android
  • Firebase Android rendimiento sin conexión
  • ¿Cómo implementar la mensajería cloud firebase en el lado del servidor?
  • Error al cargar la clase del descriptor del módulo: No encontró la clase "com.google.android.gms.dynamite.descriptors.com.google.firebase.auth.ModuleDescriptor"
  • 2 Solutions collect form web for “¿Cómo lidiar con el modo fuera de línea Firebase y el empuje de datos?”

    Así que no hay identificación única hasta que la línea se vuelva a encender

    Esta última afirmación no es cierta. Los identificadores de pulsación de Firebase se generan en el lado del cliente y se garantiza estadísticamente que son únicos.

    Usted puede comprobar esto fácilmente dividiendo su operación:

     Firebase ref = new Firebase(getString(R.string.firebase_url)); Firebase newStackRef = ref.child("stack").push(); System.out.println("New key/push id: "+newStackRef.key()); newStackRef.setValue(counter++, new Firebase.CompletionListener() { 

    La salida de registro mostrará el nuevo identificador de pulsación, incluso cuando no esté conectado a la red.

    ¡APARECE QUE LOS ESCUCHADORES SON DISPARADOS SOLAMENTE CUANDO LOS DATOS ESTÁN EN LA BASE DE DATOS EN EL SERVIDOR, Y NO EN EL DB LOCAL! ES ESO CORRECTO ?

    Los oyentes de finalización sólo se activarán una vez que se hayan confirmado los datos en el servidor.

    En la guía sobre cómo guardar datos :

    Si desea saber cuándo los datos se han confirmado, puede agregar un oyente de finalización. Ambos setValue () y updateChildren () toman un oyente de terminación opcional que se llama cuando la escritura se ha confirmado en la base de datos.

    Sin embargo, los oyentes de eventos regulares (como los creados con addValueEventListener ()) se activarán tanto para ediciones locales como remotas. Estos son los oyentes que debe usar para procesar su interfaz de usuario, etc.

    Después de lo que @ Andrew-lee y @ Frank-fan-puffelen (gracias a ambos coinciden en que por favor), la solución parece ser:

    1. Cree una identificación única con el comando push ()
    2. Agregue un listener (Single Value) a un firebase ref del nodo creado anterior en (1.)
    3. Programe su trabajo dentro del oyente (aquí actualizar la interfaz de usuario, pero podría ser otro comando)

       findViewById(R.id.button7).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Firebase temp = new Firebase(getString(R.string.firebase_url)).child("stack").push(); temp.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { ((TextView) findViewById(R.id.textView7)).setText(String.valueOf(counter) + " - " + dataSnapshot.getKey().toString()); } @Override public void onCancelled(FirebaseError firebaseError) { } }); temp.setValue(counter++); } }); 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.