Cómo iterar a través de todos los objetos Bundle

Estoy intentando crear el método del ayudante que iteraría a través de todos los objetos del paquete , de una manera genérica .

Por "genérico" quiero decir:

  1. No necesita saber los nombres (claves) de los objetos del paquete pasados ​​como parámetro.
  2. No necesita cambiar si otro miembro (clave) se agregó al Bundle en el futuro.

Hasta ahora, descubro el siguiente esquema para lograr eso:

private void bundleToSharedPreferences(Bundle bundle) { Set<String> keys = bundle.keySet(); for (String key : keys) { Object o = bundle.get(key); if (o.getClass().getName().contentEquals("int")) { // save ints } else if (o.getClass().getName().contentEquals("boolean")) { // save booleans } else if (o.getClass().getName().contentEquals("String")) { // save Strings } else { // etc. } } } 

¿Tiene sentido este enfoque?

¿Hay una mejor manera de lograr esto?

Lo haría por reflexión, si lo hiciera en absoluto. Almacene un mapa estático de tal manera que String.class vaya a SharedPreference.putString (), etc. Luego, cuando esté realizando un bucle a través de los elementos, compruebe su clase en el mapa. Si no existe, compruebe la superclase, etc. Eso le dará el método apropiado para llamar o le permitirá saber que el tipo de objeto solicitado no es algo que se puede poner en las preferencias.

Así que el algoritmo básico es:

  1. Obtener el objeto del paquete
  2. Obtener su clase
  3. Ver si la clase está en el mapa
  4. Si es así, invoca el método especificado para ponerlo en SharedPreferences
  5. Si no es así, obtenga su superclase y vuelva al paso 3.
  6. Si obtiene todo el camino hasta java.lang.Object entonces tiene un objeto empaquetado que no puede ser almacenado inmediatamente en SharedPreferences. Dependiendo de las clases que haya golpeado a lo largo del camino, es posible que desee tratar de manejar esto también o simplemente desea registrar el error y seguir adelante. Sin saber por qué está haciendo esto, es imposible adivinar cómo debe reaccionar cuando el método falla. Invariablemente, a menos que tenga control total sobre el paquete y las preferencias, pero si tienes esa cantidad de control no hay necesidad de saltar a través de todos estos aros porque podría ser mucho más sencillo y simplemente definir su propio llaves.

Nota: la reflexión no es rápida y no es la cosa más fácil de codificar y mantener. Si es posible, recomendaría encontrar un método menos genérico que se adapte a su caso de uso.

¿Podría guardar todo como String usando el método toString ()? No sé si los tipos primitivos se asignan a sus equivalentes de Objeto (por ejemplo, int a la clase Integer), pero si lo son, entonces podría ser capaz de hacer algo como esto, en lugar de comprobar laboriosamente cada clase posible.

  for (String key : bundle.keySet()) { saveKeyValueInPrefs(key, bundle.get(key).toString()); //To Implement } 

No estoy seguro de si esto funcionaría para sus necesidades, pero estoy tratando de hacer algo similar para convertir un paquete en una cadena JSON ahora mismo.

  • Problema al guardar las preferencias compartidas en Android
  • Uso de las preferencias compartidas para un ahorro de alto valor
  • SharedPreferences: ¿Es una clase o una interfaz?
  • Android - sharedferences devuelve valor nulo
  • Loader onLoadFinished () no se llama
  • Cómo cambiar mediante programación la imagen de fondo de una actividad de Android
  • SharedUserId: seguro para cambiar cuando la aplicación ya está en el mercado?
  • Cómo obtener algo útil de este registro ANR
  • Uso de preferencias compartidas entre actividades
  • ¿Cómo forzar a PreferenceActivity a manejar mis SharedPreferences?
  • MODE_PRIVATE en error de preferencias compartidas
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.