|
||
|
|
|
|||||||
| 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 |
![]() |
|
|
Herramientas |
|
#1
|
||||
|
||||
|
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
.
__________________
|
|
|
|
#2
|
||||
|
||||
|
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. |
| Gracias de parte de: | ||
|
#3
|
||||
|
||||
|
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]
__________________
|
|
#4
|
||||
|
||||
|
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. |
|
#5
|
||||
|
||||
|
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
__________________
|
|
#6
|
||||
|
||||
|
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!
|
| Gracias de parte de: | ||
![]() |
Estás aquí
|
||||||
|
||||||