2012-06-09 5 views
39

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.Cómo guardar datos en una aplicación de Android

Respuesta

4

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

He aquí una muestra: http://developer.android.com/guide/topics/data/data-storage.html#pref

Si la estructura de datos es más complejo o los datos es grande, utilice 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.

+0

Eso es derecho. Usar algo más complejo que esto es exagerar y una idea tonta. SharedPreferences es todo lo que se necesita. –

1
  1. preferencias compartidas: android shared preferences example for high scores?

  2. ¿Su aplicación tiene un acceso a la "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.}

+2

con respecto a 2) no es necesario utilizar el almacenamiento externo, que siempre requiere una comprobación (si está montada una tarjeta sd). ¿Por qué no usar el caché o el directorio de archivos de la aplicación? (getFilesDir(), getCacheDir()). –

+0

@MathiasLin debe publicar una respuesta completa. – thomasfedb

+0

@thomasfedb Ya publiqué la primera respuesta a esta pregunta, y con los enlaces y la muestra vinculada, debería ser todo lo que necesita. ¿Algo que me haya perdido? –

0

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í se puede descargar la biblioteca:

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

(Sólo hay que poner el db4o-8,0-...- todo java5.jar en el lib directorio 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.

+0

db4o me parece un poco caro. En todo caso, una base de datos sqlite probablemente sería más fácil debido a la compatibilidad que brinda Android, sin embargo, para una pequeña cantidad de datos básicos, diría que SharedPrefs sería suficiente. –

+0

En mi opinión db4o es mucho más fácil que sql especialmente para principiantes. Y menos complicado que con estas feas preferencias compartidas :-) – fivef

+0

un poco fuera de tema, pero ...: he investigado en db4o hace mucho tiempo, para proyectos que no son de Android, y la idea no está nada mal; Lo que no me gusta de db4o es que es propietario. Si quiere evitar tratar directamente con sql, también puedo recomendar ORMLite como una biblioteca ORM (ORM = object-relational-mapping). Sin embargo, supongo que db4o también funcionaría bien para esa tarea, sin dudas. –

53

Tiene dos opciones, y dejaré la selección a su criterio.

  1. Preferencias compartidas

    Este es un marco único para Android que le permite almacenar los valores primitivos (como int, boolean, y String, aunque estrictamente hablando no es String una primitiva) en un número- marco de 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ía 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 buscar en External Storage, pero yo no recomiendo que en este caso particular, debido a que el almacenamiento externo podría no estar allí más tarde. (Tenga en cuenta que si elige esto, requiere un permiso)

+14

LOL - Me gusta ese comentario "porque nunca he visto una puntuación de baloncesto superior a 128" :-) por cierto: para su referencia: http://www.nba.com/pistons/news/highest_score_071211.html –

+6

En Hyrule, el hombre más rico vivo solo podría tener 255 rupias. ;) – Neil

+0

Creo que puede usar sqlite también para el almacenamiento – monim

10

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

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

lo que realmente necesita un sistema de múltiples puntos:

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(), compruebe que el paquete transferido no sea nulo y, de ser así, restablezca 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. Me gustaría no puntajes de la tienda aquí, solo las cosas que necesita para reiniciar la aplicación. Luego, en onCreate(), cuando no haya un objeto agrupado, use la interfaz SharedPreferences para recuperar esa configuración.

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 serán 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 simples archivos CSV para sus datos, para que otras aplicaciones pueden leer con facilidad.

Obviamente, tendrá que escribir actividades que permitan los cuadros de diálogo "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.

+0

Un comentario más: en todo caso posible, haga la lectura y la escritura en un hilo diferente, especialmente la escritura. De lo contrario, su aplicación se congela y el usuario tiene una experiencia menos que óptima. –

0

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.

Google docs about storage - por favor busque en particular a getExternalStoragePublicDirectory

3

Hay una gran cantidad de opciones para almacenar sus datos y Android le ofrece para elegir cualquiera Sus opciones de almacenamiento de datos son los siguientes:

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

Verificar here de ejemplos y tuto

7

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(); 
Cuestiones relacionadas