En una acción de snackbar, ¿cómo puedo asegurarme de que es seguro borrar de forma permanente un registro borrado por software de la base de datos?

Estoy utilizando Snackbar en android y he implementado una acción para que el usuario puede deshacer la acción (la acción está borrando todos los elementos de la lista). Eliminar y agregar los elementos de nuevo a la lista ya se ha hecho y funciona bien.

Mi problema es que, los elementos se almacenan en la base de datos sqlite y cómo puedo eliminar los elementos de las tablas? (¿Cómo puedo saber que el usuario no ha hecho clic en el botón deshacer, para que pueda eliminar completamente los datos de la base de datos).

Este es el código dentro de OnOptionsItemSelcted ()

case R.id.action_clear: final List<Word> temp = new ArrayList<Word>(data); data.clear(); adapter.notifyDataSetChanged(); View view = findViewById(R.id.layoutFavWords); Snackbar.make(view,"Deleted Saved Selection.", Snackbar.LENGTH_LONG). setAction("Undo", new OnClickListener() { @Override public void onClick(View v) { for(Word word:temp) data.add(word); adapter.notifyDataSetChanged(); } }).show(); break; 

Así que si el usuario no ha hecho clic en el botón de deshacer durante el período visible de la barra de menús, entonces necesito borrar permanentemente los datos de la base de datos.

¿Alguna solución para esto?

Por lo que sé, es por diseño. Debieras:

  • Elimine el elemento tan pronto como el usuario toque el botón de borrado;
  • Guárdelo temporalmente en una variable de clase;
  • Si el usuario teclea Deshacer, vuelva a agregar el elemento a la base de datos.

Este enfoque es más seguro y más robusto; Usted no debe esperar para que la barra se deseche, porque esa acción no podría incluso suceder. Piensa en la fuerza del usuario: dejar de usar la aplicación mientras la barra de menú todavía está encendida: ¿se debería eliminar el elemento o no? Debería.

Una fuente más confiable es este post g + de Ian Lake. En los comentarios se puede leer:

Desea que su interfaz de usuario reaccione de inmediato (no espere a que desaparezca la barra de menús) – la mayoría de los sistemas (en particular los que se sincronizan con un servidor externo) tienen el concepto de un "borrado suave" donde las cosas se marcan como borradas. En esos casos, una acción de deshacer sería simplemente desmarcar el registro como eliminado. Este sistema funciona incluso si el usuario dejara la aplicación antes de que termine el snack (no se puede asumir que la barra de snack siempre completará su animación).

La forma más sencilla de hacerlo es guardar temporalmente el registro en otro lugar (incluso una variable local) y, a continuación, volver a insertarlo si suceden al pulsar el botón de deshacer.

La biblioteca de soporte de Android v23 agregó Snackbar.Callback que puedes usar para escuchar si el snackbar fue rechazado por el usuario o el tiempo de espera.

Ejemplo tomado de la publicación de astinx :

 Snackbar.make(getView(), "Hi there!", Snackbar.LENGTH_LONG).setCallback( new Snackbar.Callback() { @Override public void onDismissed(Snackbar snackbar, int event) { switch(event) { case Snackbar.Callback.DISMISS_EVENT_ACTION: Toast.makeText(getActivity(), "Clicked the action", Toast.LENGTH_LONG).show(); break; case Snackbar.Callback.DISMISS_EVENT_TIMEOUT: Toast.makeText(getActivity(), "Time out", Toast.LENGTH_LONG).show(); break; } } @Override public void onShown(Snackbar snackbar) { Toast.makeText(getActivity(), "This is my annoying step-brother", Toast.LENGTH_LONG).show(); } }).setAction("Go away!", new View.OnClickListener() { @Override public void onClick(View v) { } }).show(); 

Ejemplo:

 final java.util.Timer timer = new Timer(); Snackbar snackbar = Snackbar.make(...).setAction("Undo", new OnClickListener() { @Override public void onClick(View v) { timer.cancel(); for(Word word:temp) data.add(word); adapter.notifyDataSetChanged(); } }).show(); timer.schedule(new TimerTask() { public void run() { // delete from db } }, snackbar.getDuration()); 

Puede ser una buena idea agregar un poco al tiempo de snackbar.getDuration () (100-200ms?), Ya que los temporizadores no son muy exactos en términos de tiempo y de esta manera se pueden llamar justo antes de que el snackbar esté a punto de cerrarse, Aunque la posibilidad es bastante pequeña en este caso.

  • Android Snackbar NullPointerException en Fragmento
  • SnackBar aparecen animación
  • ¿Cómo puedo ser notificado cuando una Snackbar se ha despedido?
  • ¿Cómo puede ajustar Android SnackBar a una posición específica en la pantalla
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.