PDA

Ver la Versión Completa : [ CONSULTA ] Duda con persistencia de datos de configuracion


kevin7rm
16/05/13, 17:48:35
Hola amigos, soy totalmente nuevo en el trabajo con Android, estoy aprendiendo de todo un poco en tiempo record por necesidad de desarrollar una app. Tengo una duda y quiero que me den sugerencias de que estudiarme o que aplicar en el siguiente caso:
Mi app necesita tener ciertos datos iniciales de configuración. Vi algo de SQLite, pero me parece más que su objetivo va dirigido a guardar datos de la aplicación en su interacción con el usuario, como por ejemplo los score de un juego, que son datos que se generarán post-instalada la apk. Pero en mi caso no me refiero a eso, imaginemos que en mi aplicacion necesito tener 2 listas desplegables de seleccion, la primera con los datos (1,2,3,4,5) y la segunda con los datos (1.1, 1.2, 2.1, 2.3, 5.1) etcetera. Con esto quiero expresar que los items del segundo listado dependerán de los que elija en el primera.

Cual sería la mejor manera de almacenar esos datos de configuracion de modo que luego, cuando actualice la aplicacion puedan ser actualizados de una manera sencilla incorporando nuevos items a las colecciones: ¿SQLite? ¿XML? ¿?

No sé absolutamente nada de eso aún asi que si pudieran sugerirme algun link o ejemplo por donde estudiar una opcion se los agradeceré.
Saludos

Celtium
17/05/13, 01:54:32
A ver segun entiendo quieres declarar unas varibles que van contener unos valores y quieres relacionarlos para que segun se seleccione uno de la 1º lista salga siempre otro de la 2º lista.

A ver si esta forma te vale.

1º Los datos del primer listado varian pero sabemos cuales son, despues de variarlos tendremos que guardar esa variación para que no se pierda al cerrar la app.

En java se pueden declarar variables de forma Static, esto basicamente es que se puede acceder a esas varibles sin tener que crear un objeto de esa clase, directamente este donde este si es public.

Entonces en una clase nueva, o en una de la que extiende tu activity, creamos una variable asi:

public static int LISTA1[] = new int[] { 1,2,3,4,5,6};
desde la activity puedes acceder a ella, simplemente, llamando a la variable LISTA1[x] o tuclase.LISTA1[x]

tambien creamos otra lista igual:
public static int LISTA2[] = new int[] { 1.1, 2.1, 3.1, 4.1, 5.1, 6.1};
a la cual se accede del mismo modo. LISTA2[X] o tuclase.LISTA2[x]

Estos los mostraras en un listado, pero ahora lo que puede pasar es que varien la lista, pero no la relacion estre las listas. Es decir que si en un principio mostramos en esas lista
1-1.1
2-2.1
3-3.1
...

puede darse el caso que despues de los cambios termine mostrandose

2-2.1
1-1.1
3-3.1
...

Pues entonces tendremos que guardar de mamera persistente en otra lista las posiciones del listado.
Si son pocos los valores pude guardarlos con Shareprefernces y despues relacionar los valores de las listas para ver que mostrar despues de reiniciar.

Las dos variables de antes son como los patrones donde estan los valores que pueden llegar a valer los datos a mostrar. En las Shareprferences guardas los valores ordenados de una de las listas y despues las montas relacionando las dos primeras variables.

En la misma clase de antes creas estas varibles:

private SharedPreferences mPreferencias;
public static final String PREFERENCIAS = "preferencias";
public static final String PREFERENCIAS_LISTADO_FINAL = "listado_final"; // array de int

Las dos primeras es para poder trabajar con la variable desde la propia clase. Por que vamos a crear un metodo que escriba y lea la variable PREFERENCIAS_LISTADO_FINAL, que es un array de ints

El metodo que escribe los valores segun el ultimo orden mostrado, pero no lo puedes guardar en la LISTA1, esas varibles son la referencia a mostrar no donde guardas los datos, los aguardas en PREFERENCIAS_LISTADO_FINAL:

/** Metodo que graba un int en la posicion x el ARRAY PREFERECIAS.
*
* @param preferecias: La varaible preferencias en que se grabara el int[].
* @param posicion: la posicion en el array.
* @param value: el valor del int a grabar.
*/
public void SET_INT_ARRAY_PREFERECIAS (String preferecias, int posicion, int value){
String[] notas=GET_ARRAY_PREFERENCIAS(preferecias);
for (int x=0; x<posicion; x++){
if (x==posicion-1){
String valor=notas[x];
if (!(valor==null)){
notas[x]=String.valueOf(value);
SET_ARRAY_PREFERENCIAS(notas, preferecias);
}
}
}
}el metodo que devuelve directamente el Array de int completo:

/** Metodo que devuelve los valores en forma de Int[] que hay guardado en la PREFERENCIAS
*
* @param variable_preferencias: Es la variable PREFERENCIAS que queremos leer.
* @return: El Int[] que hay en l avariable_preferencias
*
* NOTA: SOLO PARA PREFERECIAS QUE SEAN ARRAYS DE INT.
*/
public int[] GET_ARRAY_INT_PREFERENCIAS(String variable_preferencias) {
mPreferencias = getSharedPreferences(PREFERENCIAS, Context.MODE_PRIVATE);
int tamaño = mPreferencias.getInt(variable_preferencias + "_size", 0);
int array[] = new int[tamaño];
for(int x=0;x<tamaño;x++){
String valor = mPreferencias.getString(variable_preferencias + "_" + x, null);
if (valor=="") valor="0";
array[x] = Integer.parseInt(valor);
}
return array;
} El metodo para leer los valores de la PREFERENCIAS_LISTADO_FINAL

/** Metodo que lee un int en la posicion x de un ARRAY PREFERECIAS.
*
* @param preferecias: La varaible preferencias en que se grabara el int[].
* @param posicionla posicion en el array.
* @return: el valor en forma de int qur hay en esa posición.
*/
public int GET_INT_ARRAY_PREFERECIAS (String preferecias, int posicion){
String[] notas=GET_ARRAY_PREFERENCIAS(preferecias);
int nota=0;
for (int x=0; x<posicion; x++){
if (x==posicion-1){
String valor=notas[x];
if (!(valor==null)){
nota=Integer.valueOf(valor);
} else nota=0;
}
}
return nota;
}Si el valor a mostrar no es un int este metodo devuelve un 0, a mi me valio esta solución...

Cuando abres por primera vez la app que lea los datos de las varibles LISTA1 y LISTA2 y guardas los actuales de LISTA1 en el array de preferecinas, un for() con SET_INT_ARRAY_PREFERECIAS (String PREFERENCIAS_LISTADO_FINAL, int x, int LISTA[x]) te vale

Ahora cuando cambias un valor del listado en la activiy llamas al metodo
SET_INT_ARRAY_PREFERECIAS (String PREFERENCIAS_LISTADO_FINAL, int posicion, int value);

Cuando abres de nuevo la app en vez de leer la variable LISTA1, vas a preguntar si hay un array en PREFERENCIAS_LISTADO_FINAL distinto de {0,0,0,0,0,0,...} (recuerda que da valor 0 si no hay nada)

Si es asi usa los metodos segun te venga mejor:

GET_INT_ARRAY_PREFERECIAS (String PREFERENCIAS_LISTADO_FINAL, int posicion)
devuele un int o
GET_ARRAY_INT_PREFERENCIAS(String PREFERENCIAS_LISTADO_FINAL)
devuelve un arry int, con valor 0 si no hay nada.

Teniendo ese valor ultimo de uno de los listados puedes crear un metodo donde obtengas el otro valor.
Algo parecido a:

private int dame_pareja (int valor)

devuelve un int segun el int que le mandas, con un for() que recorra los arrays LISTA1 Y LISTA2 ya esta.

No se si lo complique todo demasiado... pero espero que te valga.

;)

PD, hazme el favor, me presente al BBVA Open Talent 2013 y fui preselecionado, estaria bien que votaras mi proyecto. Lo pone en mi firma, Gracias ;)