Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android

Respuesta
 
Herramientas
  #1  
Viejo 22/08/16, 11:33:54
Array

[xs_avatar]
kaiser75 kaiser75 no está en línea
Miembro del foro
 
Fecha de registro: ene 2011
Mensajes: 493
Modelo de smartphone: Vernee Mars, Galaxy S3
Tu operador: Orange
Seccion de Favoritos y SQlite

Tengo 4 actividades con un ListView con un adapter personalizado en cada una, dos textos y un checkbox el cual al estar marcado me guarda los valores (nombre y apellido) en una Base de Datos SQlite a modo de favoritos, hasta ahi todo bien ya que consigo mas o menos guardar los valores y los muestro en la Activity de favoritos. El tema es como puedo guardar en la BD el estado del checkbox y que al volver a la activity se me muestren como marcados los que he añadido a la lista de favoritos? (como valor "1" o "0" por ejemplo), ya que al volver a la actividad de donde se guardo el valor el checkbox me aparece desmarcado. Encontre un ejemplo del compañero rafaxplayer que lo hacia con un ratingbar. Cuando tenga un momento pondre algo del codigo que tengo .
__________________
Responder Con Cita


  #2  
Viejo 22/08/16, 12:34:13
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
Por el mero hecho de guardar los valores del CheckBox en la BD no van a aparecer mágicamente en la Activity si no los cargas primero.

Ya se ha hablado 1000 veces, Android no tiene persistencia por si misma, es más, si en un RecyclerView marcas un CheckBox y sacas el elemento fuera del scroll, cuando vuelvas no estará, o peor aún, estará en otro elemento distinto.

De todas formas hay que diferenciar lo que se quiere hacer:

1) Si quieres que cuando cierres la app, y la siguiente vez que la vuelvas a ejecutar, los CheckBox que estaban marcados sigan estándolo, tienes que almacenar en el SQLite los estados, en el onCheckedChanged de cada CheckBox. Así quedarán guardados por cada cambio que hagas.

Luego para restaurar su estado, basta con poner en el onCreate el código para sacar los estados del SQLite previamente almacenados y asignar a cada uno su valor.

2) Si lo que quieres es que los estados de los CheckBox sean persistentes sólo durante la sesión, por ejemplo, abro la Activity con los CheckBox, esa me lleva a otra, y al volver los CheckBox no están marcados. En ese caso es que Android ha tenido que destruir la Activity y la ha vuelto a crear, para esto te basta con almacenar los valores en el Bundle del onSaveInstanceState y restaurarlos en el onCreate.
Responder Con Cita
Gracias de parte de:
  #3  
Viejo 23/08/16, 10:31:55
Array

[xs_avatar]
kaiser75 kaiser75 no está en línea
Miembro del foro
 
Fecha de registro: ene 2011
Mensajes: 493
Modelo de smartphone: Vernee Mars, Galaxy S3
Tu operador: Orange
Gracias por la explicacion kriogeN, lo que intento desde hace dias es la opcion 1, cuando marco el checkbox me guarda el registro en la Base de Datos, y al desmarcarlo me lo borra (aun no lo he conseguido pero, lo comente en otro post). Este es el codigo que tengo en el Adapter de la lista de las actividades desde donde se guardan los favoritos, los checkbox se me marcan, guardan el registro, hago scroll y no se me descolocan ni nada, funcionan correctamente, lo unico es que no se me quedan marcados al volver a la actividad o al arrancar la aplicacion de nuevo. cual es la mejor manera de guardar los valores del checkbox en SQlite? yo lo guardo como un String de texto y el valor 1

en la clase DBFavoritos tengo , public static final String KEY_FAV = "favorito"; que es donde almaceno los valores

[php]
...
int checked = 0; // variable definida fuera del adapter


...
public class miAdapter ... etc { // Adapter

holder.cb = (CheckBox) v.findViewById(R.id.checkbox);
...

holder.cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

@override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

String nombre ... etc ; // obtengo el nombre del elemento de la lista
String apellido ... etc ; // obtengo el apellido ...

if (isChecked) {
checked = 1;
String favorito = String.valueOf(checked); // guardo valor en SQlite como "1", es correcto?

mDbHelper = new DbFavoritos(Activity1.this);
mDbHelper.open();
mDbHelper.createFav(nombre, apellido, favorito);

} else {
checked = 0; // ??
//mDbHelper.deleteFav(); // no se como obtener el id correcto para borrar el elemento agregado
}

}
});

[/php]Despues en la clase DBFavoritos tengo este codigo para "intentar" mostrar solo el valor del checkbox guardado, aqui es donde creo que tengo el pitoste ya que es donde no consigo mostrar este valor en el "setChecked" de la actividad desde donde se ha guardado el elemento.
[php]
public Cursor estadoCheckBox(Long mRowId) {
return mDb.query(DATABASE_TABLE, new String[] {KEY_FAV},
null, null, null, null, null);
}
[/php]
__________________
Responder Con Cita
  #4  
Viejo 23/08/16, 12:04:00
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
Veo muchos fallos de concepto de como funciona SQLite (o cualquier BD en general), por ejemplo guardar el 1 como String (SQLite no tiene Boolean ,pero yo lo simulo con un INTEGER y un valor ? 1 : 0), no saber como pasar el Id al Delete (siempre tienes que buscar una PK para todos tus datos) y no pasar el parámetro que quieres buscar en el Query (ligado con lo anterior de la PK).

Lo mejor es que empieces por un tutorial de SQLite, además de modelar SIEMPRE todos los datos que vayan a estar en una SQLite, así luego los cambios son mucho más sencillos. Teniendo en cuenta que los datos que puedes llegar a sacar una SQLite son muchos, modelando puedes hacerlos Parcelables, ayudando al sistema a controlar la memoria si es preciso.
Responder Con Cita
  #5  
Viejo 24/08/16, 10:28:06
Array

[xs_avatar]
kaiser75 kaiser75 no está en línea
Miembro del foro
 
Fecha de registro: ene 2011
Mensajes: 493
Modelo de smartphone: Vernee Mars, Galaxy S3
Tu operador: Orange
No si la base de datos me funciona bien, lo unico que me salta un error cada vez que intento llamar el estado del checkbox desde la BD para ponerlo en el "setChecked()" y ya no se por donde tirar .
Creo que el tema esta en que guardo el valor como un "1" si esta marcado el checkbox en un String de la BD y como despues le digo al checkbox que si el valor de la BD es "1" el setChecked sea true?

Este es el error que me salta
Código:
java.lang.NullPointerException: Attempt to invoke interface method 'int  android.database.Cursor.getColumnIndexOrThrow(java.lang.String)' on a  null object reference
__________________
Responder Con Cita
  #6  
Viejo 24/08/16, 16:03:18
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,203
Tu operador: -

 Cita: Originalmente Escrito por kaiser75 Ver Mensaje
guardo el valor como un "1" si esta marcado el checkbox en un String de la BD y como despues le digo al checkbox que si el valor de la BD es "1" el setChecked sea true?
Ya te contesté eso mismo la última vez que dijiste que guardabas "true". Si ahora pones "1" sigue siendo igual de feo pero la respuesta no cambia:

boolean valor = "1".equals(stringDeLaBD);

De todas formas la excepción que te da no tiene que ver nada, estás llamando a un método de una variable que está a null.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Responder Con Cita
Gracias de parte de:
Respuesta

Estás aquí
Regresar   Portal | Indice > Todo sobre Android > Programación y Desarrollo para Android



Hora actual: 18:03:03 (GMT +1)



User Alert System provided by Advanced User Tagging (Lite) - vBulletin Mods & Addons Copyright © 2025 DragonByte Technologies Ltd.

Contactar por correo / Contact by mail / 邮件联系 /