Cómo guardar datos en una aplicación de Android

Recientemente codifiqué una aplicación de Android. Es solo una aplicación simple que te permite llevar el puntaje de un juego de baloncesto con algunos contadores simples. Me piden que agregue una función de guardado, para que pueda guardar sus puntajes y luego cargarlos nuevamente. Actualmente, cuando detiene la aplicación, sus datos se pierden. Entonces, lo que me preguntaba es qué tendría que agregar para que la aplicación guarde una etiqueta (puntaje) y luego vuelva a cargarla. Gracias chicos, lo siento, no sé mucho sobre esto.

Tienes dos opciones, y te dejaré la selección.

  1. Preferencias compartidas

    Este es un marco exclusivo de Android que le permite almacenar valores primitivos (como int , boolean, y String , aunque estrictamente hablando, String no es una primitiva) en un marco de clave-valor. Esto significa que le da un valor a un nombre, por ejemplo, “homeScore” y almacena el valor de esta clave.

     SharedPreferences settings = getApplicationContext().getSharedPreferences(PREFS_NAME, 0); SharedPreferences.Editor editor = settings.edit(); editor.putInt("homeScore", YOUR_HOME_SCORE); // Apply the edits! editor.apply(); // Get from the SharedPreferences SharedPreferences settings = getApplicationContext().getSharedPreferences(PREFS_NAME, 0); int homeScore = settings.getInt("homeScore", 0); 
  2. Almacenamiento interno

    Esto, en mi opinión, es lo que podrías estar buscando. Puede almacenar todo lo que desee en un archivo, por lo que le brinda más flexibilidad. Sin embargo, el proceso puede ser más complicado porque todo se almacenará como bytes, lo que significa que debe tener cuidado de mantener sus procesos de lectura y escritura trabajando en conjunto.

     int homeScore; byte[] homeScoreBytes; homeScoreBytes[0] = (byte) homeScore; homeScoreBytes[1] = (byte) (homeScore >> 8); //you can probably skip these two homeScoreBytes[2] = (byte) (homeScore >> 16); //lines, because I've never seen a //basketball score above 128, it's //such a rare occurance. FileOutputStream outputStream = getApplicationContext().openFileOutput(FILENAME, Context.MODE_PRIVATE); outputStream.write(homeScoreBytes); outputStream.close(); 

Ahora, también puede consultar el Almacenamiento externo , pero no lo recomiendo en este caso particular, ya que es posible que el almacenamiento externo no esté allí más adelante. (Tenga en cuenta que si elige esto, requiere un permiso)

OP está pidiendo una función de “guardar”, que es más que simplemente preservar los datos en todas las ejecuciones del progtwig (lo que debe hacer para que la aplicación valga la pena).

Recomiendo guardar los datos en un archivo en la tarjeta SD, lo que le permite no solo recuperarlo más tarde, sino que también permite al usuario montar el dispositivo como una unidad externa en su propia computadora y tomar los datos para usarlos en otros lugares.

Entonces realmente necesitas un sistema multipunto:

1) Implementar onSaveInstanceState() . En este método, se le pasa un paquete, que es básicamente como un diccionario. Almacene tanta información en el paquete como sea necesario para reiniciar la aplicación exactamente donde lo dejó. En su método onCreate() , verifique que el paquete transferido no sea nulo y, de ser así, restaure el estado del paquete.

2) Implementar onPause() . En este método, cree un editor de Preferencias Compartidas y úselo para guardar cualquier estado que necesite para iniciar la aplicación la próxima vez. Esto se compone principalmente de las preferencias de los usuarios (de ahí el nombre), pero cualquier otra cosa relacionada con el estado de inicio de la aplicación debería ir aquí también. No almacenaría puntajes aquí, solo las cosas que necesita para reiniciar la aplicación. Luego, en onCreate() , cuando no haya un objeto bundle, use la interfaz SharedPreferences para recuperar esas configuraciones.

3a) En cuanto a puntajes, puede seguir los consejos de Mathias arriba y almacenar los puntajes en el directorio devuelto en getFilesDir() , usando openFileOutput() , etc. Creo que este directorio es privado para la aplicación y vive en el almacenamiento principal, lo que significa que otras aplicaciones y el usuario no podrían acceder a los datos. Si te parece bien, entonces este es probablemente el camino a seguir.

3b) Si desea que otras aplicaciones o el usuario tengan acceso directo a los datos, o si los datos van a ser muy grandes, entonces la tarjeta SD es el camino a seguir. Elija un nombre de directorio como com / user1446371 / basketballapp / para evitar colisiones con otras aplicaciones (a menos que esté seguro de que el nombre de su aplicación es razonablemente único) y cree ese directorio en la tarjeta SD. Como señaló Mathias, primero debes confirmar que la tarjeta sd está montada.

 File sdcard = Environment.getExternalStorageDirectory(); if( sdcard == null || !sdcard.isDirectory()) { fail("sdcard not available"); } File datadir = new File(sdcard, "com/user1446371/basketballapp/"); if( !datadir.exists() && !datadir.mkdirs() ) { fail("unable to create data directory"); } if( !datadir.isDirectory() ) { fail("exists, but is not a directory"); } // Now use regular java I/O to read and write files to data directory 

Recomiendo archivos CSV simples para sus datos, para que otras aplicaciones puedan leerlos fácilmente.

Obviamente, tendrá que escribir actividades que permitan diálogos de “guardar” y “abrir”. En general, solo hago llamadas al administrador de archivos openintents y dejo que haga el trabajo. Sin embargo, esto requiere que sus usuarios instalen el administrador de archivos openintents para hacer uso de estas características.

En onCreate:

 SharedPreferences sharedPref = getSharedPreferences("mySettings", MODE_PRIVATE); String mySetting = sharedPref.getString("mySetting", null); 

En onDestroy o equivalente:

 SharedPreferences sharedPref = getSharedPreferences("mySettings", MODE_PRIVATE); SharedPreferences.Editor editor = sharedPref.edit(); editor.putString("mySetting", "Hello Android"); editor.commit(); 

Use SharedPreferences, http://developer.android.com/reference/android/content/SharedPreferences.html

Aquí hay un ejemplo: http://developer.android.com/guide/topics/data/data-storage.html#pref

Si la estructura de datos es más compleja o los datos son grandes, use una base de datos Sqlite ; pero para una pequeña cantidad de datos y con una estructura de datos muy simple, diría que las Preferencias Compartidas funcionarán y que una BD podría estar sobrecargada.

Hay muchas opciones para almacenar sus datos y Android le ofrece elegir cualquiera. Sus opciones de almacenamiento de datos son las siguientes:

Preferencias compartidas Almacene datos primitivos privados en pares clave-valor. Almacenamiento interno Almacene datos privados en la memoria del dispositivo. Almacenamiento externo Almacene datos públicos en el almacenamiento externo compartido. Bases de datos SQLite Almacena datos estructurados en una base de datos privada. Conexión de red Almacene datos en la web con su propio servidor de red

Mira aquí ejemplos y tuto

  1. Preferencias compartidas: ejemplo de preferencias compartidas android para puntajes altos?

  2. ¿Su aplicación tiene acceso a “medios de almacenamiento externos”? Si lo hace, puede simplemente escribir el valor (almacenarlo con la marca de tiempo) en un archivo y guardarlo. La marca de tiempo le ayudará a mostrar el progreso si eso es lo que está buscando. {no es una solución inteligente.}

En mi opinión, db4o es la forma más fácil de hacerlo. Aquí puede encontrar un tutorial: http://community.versant.com/documentation/reference/db4o-7.12/java/tutorial/

Y aquí puedes descargar la biblioteca:

http://www.db4o.com/community/download.aspx?file=db4o-8.0-java.zip

(Simplemente ponga db4o-8.0 …- all-java5.jar en el directorio lib en la carpeta libs de su proyecto. Si no hay una carpeta libs en su proyecto, créelo)

Como db4o es un sistema de base de datos orientado a objetos, puede guardar directamente los objetos en la base de datos y luego recuperarlos.

No olvide una cosa: los datos de almacenamiento interno se eliminan cuando desinstala la aplicación. En algunos casos, puede ser una “característica inesperada”. Entonces es bueno usar almacenamiento externo.

Documentos de Google sobre almacenamiento : consulte en particular en getExternalStoragePublicDirectory