2012-08-10 16 views
26

Estoy tratando de crear un método auxiliar que iteraría a través de todos los objetos Bundle, de una manera generic.Cómo iterar a través de todos los objetos Bundle

Por "genérico" que quiero decir:

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

Hasta ahora, averiguar el siguiente esquema para lograrlo:

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. 
     } 
    } 
    } 

hace esto enfoque tiene sentido en absoluto?

¿Hay una mejor manera de lograr esto?

+2

No creo que este diseño tenga sentido.Sus preferencias y lo que viene en un paquete no necesariamente deben incluirse necesariamente en el paquete ya que tiene claves específicas que deben asignarse a la preferencia. Estos se identifican a través de claves, que debería haber codificado. – JoxTraex

+0

Creo que tienes razón. Pero, ¿hay alguna forma ** sensata ** de guardar un paquete en almacenamiento persistente (local)? – ateiob

+0

Intentando usar una base de datos SQLite. – JoxTraex

Respuesta

3

Lo haría a través de la reflexión, si tuviera que hacerlo en absoluto. Almacene un Mapa estático tal que String.class se correlacione con SharedPreference.putString(), etc. Luego, cuando esté revisando los elementos, verifique su clase con el mapa. Si no existe, verifique la superclase, etc. Eso le dará el método adecuado para llamar o le informará que el tipo de objeto solicitado no es algo que pueda incluirse en las preferencias.

lo tanto, el algoritmo básico es:

  1. obtener el objeto desde el haz
  2. Obtener su clase
  3. Ver si la clase está en el mapa
  4. Si es así, invocar el método especificado para ponerlo en las Preferencias Compartidas
  5. Si no es así, consiga su superclase y vuelva al paso 3.
  6. Si sube hasta java.lang.Obj ect entonces tiene un objeto incluido que no puede almacenarse inmediatamente en SharedPreferences. Dependiendo de las clases a las que hayas tocado en el camino, es posible que quieras intentar manejar esto también o quizás quieras registrar el error y continuar. Sin saber por qué está haciendo esto, es imposible adivinar cómo debe reaccionar cuando falla el método. Invariablemente lo hará a menos que tenga un control total sobre el paquete y las preferencias, pero si tiene esa cantidad de control no hay necesidad de pasar por todos estos obstáculos porque podría ser mucho más directo y simplemente definir el suyo propio. llaves.

Nota: el reflejo no es rápido y no es lo más fácil de codificar y mantener. De ser posible, recomendaría encontrar un método menos genérico que se adapte a su caso de uso.

+1

Lo interpreto como "* Do ** not ** iIterate a través de todos los objetos Bundle! *". Aceptando ya que nadie más brindó una mejor respuesta. – ateiob

52

¿Podría guardar todo como String utilizando el método toString()? No sé si los tipos primitivos están asignados a sus equivalentes de objeto (por ejemplo, int a clase Integer), pero si lo son, entonces podrías hacer algo como esto, en lugar de verificar laboriosamente cada clase posible.

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

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

Cuestiones relacionadas