Como salvar dados em um aplicativo android

Recentemente codificei uma aplicação Android. É apenas um aplicativo simples que lhe permite manter a pontuação de um jogo de basquete com alguns intervalos de contador simples. Estou a ser requisitado para adicionar um recurso de salvamento, para que possas salvar as tuas pontuações e depois carregá-las de volta. Atualmente, quando você parar o aplicativo, seus dados são perdidos. Então o que eu estava me perguntando é o que eu teria que adicionar para ter o aplicativo salvar uma etiqueta (pontuação) e, em seguida, carregá-lo de volta. Obrigado, rapazes. desculpem, não sei muito sobre estas coisas.

 43
Author: MuhammadAliJr, 2012-06-09

8 answers

Tens duas opções e deixo a selecção contigo.
  1. Preferências Partilhadas

    Este é um quadro único para o Android que lhe permite armazenar valores primitivos (tais como int, boolean, e String, embora estritamente falando String não seja um primitivo) numa estrutura de valor-chave. Isto significa que você dá um valor a um nome, diga, "homeScore" e armazena o valor a esta chave.
    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. Armazenamento Interno

    Isto, na minha opinião, é o que tu pode estar à procura. Você pode armazenar qualquer coisa que você quiser para um arquivo, então isso lhe dá mais flexibilidade. No entanto, o processo pode ser mais complicado porque tudo será armazenado como bytes, e isso significa que você tem que ter cuidado para manter seus processos de leitura e escrita trabalhando juntos.
    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();
    

Agora, você também pode olhar para Armazenamento Externo , mas eu não recomendo que neste caso em particular, porque o armazenamento externo pode não estar lá mais tarde. (Note que se você escolher isto, requer uma permissão)

 60
Author: gobernador, 2014-03-28 18:07:41

O OP está a pedir uma função "save", que é mais do que apenas preservar dados através das execuções do programa (o que você deve fazer para que o aplicativo valha alguma coisa.)

Eu recomendo salvar os dados em um arquivo no sdcard, que permite não só acessa-lo mais tarde, mas permite que o usuário monte o dispositivo como um disco externo no seu próprio computador e pegar os dados para uso em outros lugares.

Então, precisas mesmo de um sistema multi-pontos.

1) implementar onSaveInstanceState(). Em este método, você é passado um pacote, que é basicamente como um dicionário. Armazenar o máximo de informações no pacote que seria necessário para reiniciar o aplicativo exatamente onde ele parou. No seu método onCreate(), Verifique se o pacote de entrada não é nulo, e se assim for, restaure o estado a partir do pacote.

2) implementar onPause(). Neste método, crie um editor de SharedPreferences e use-o para salvar qualquer estado que você precisa para iniciar o aplicativo para a próxima vez. Esta é constituída principalmente pelos utilizadores preferências (daí o nome), mas qualquer outra coisa relavent para o estado start-up do aplicativo deve ir aqui também. Eu não guardaria as notas aqui, só as coisas que precisas para reiniciar a aplicação. Então, em onCreate(), sempre que não houver nenhum Objeto bundle, use a interface SharedPreferences para recordar essas configurações.

3a) quanto a coisas como pontuações, você poderia seguir o conselho de Mathias acima e armazenar as pontuações no diretório retornado em getFilesDir(), Usando openFileOutput(), etc. Eu acho que este diretório é private to the app and lives in main storage, meaning that other apps and the user would not be able to access the data. Se não te importares, este deve ser o caminho a seguir.

3b) se você quer que outros aplicativos ou o usuário tenham acesso direto aos dados, ou se os dados vão ser muito grandes, então o sdcard é o caminho a seguir. Escolha um nome de pasta como com / user1446371/ basketballapp / para evitar colisões com outras aplicações (a menos que tenha a certeza que o seu nome da aplicação é razoavelmente único) e criar esse directório no sdcard. Como Mathias apontou, você deve primeiro confirmar que o sdcard está montado.

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

Eu recomendo arquivos CSV simples para os seus dados, para que outras aplicações possam lê-los facilmente.

Obviamente, terá de escrever actividades que permitam diálogos de" gravar" e "abrir". Geralmente faço chamadas para o Gestor de ficheiros openintents e deixo-o fazer o trabalho. Isto requer que os seus utilizadores instalem o Gestor de ficheiros openintents para faça uso dessas características, no entanto.
 10
Author: Edward Falk, 2016-05-27 20:33:46

Em oncreato:

SharedPreferences sharedPref = getSharedPreferences("mySettings", MODE_PRIVATE);

    String mySetting = sharedPref.getString("mySetting", null);

Em onDestroy ou equivalente:

SharedPreferences sharedPref = getSharedPreferences("mySettings", MODE_PRIVATE);

    SharedPreferences.Editor editor = sharedPref.edit();
    editor.putString("mySetting", "Hello Android");
    editor.commit();
 8
Author: Martin.Martinsson, 2014-09-30 23:00:10

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

Aqui está uma amostra.: http://developer.android.com/guide/topics/data/data-storage.html#pref

Se a estrutura de dados for mais complexa ou os dados forem grandes, use um banco de dados Sqlite; mas para uma pequena quantidade de dados e com uma estrutura de dados muito simples, eu diria, SharedPrefs irá fazer e um DB pode estar por cima.

 5
Author: Mathias Conradt, 2012-06-09 16:00:47
Há muitas opções para armazenar os seus dados e o Android oferece-lhe para escolher qualquer um As suas opções de armazenamento de dados são as seguintes:

Preferências Partilhadas Armazenar dados primitivos privados em pares de valores-chave. Armazenamento Interno Guardar dados privados na memória do dispositivo. Armazenamento Externo Armazenar dados públicos sobre o armazenamento externo compartilhado. Bases De Dados SQLite Armazenar dados estruturados em uma base de dados privada. ligacao Guardar os dados na web com o seu próprio servidor de rede

Verifique aqui para exemplos e tuto

 3
Author: Mohamed ALOUANE, 2014-04-22 11:10:43
  1. Preferências partilhadas: O android partilhou preferências por exemplo para os recordes?

  2. A sua aplicação tem acesso aos"suportes de armazenamento externos". Se o fizer, então você pode simplesmente escrever o valor (armazená-lo com o timestamp) em um arquivo e salvá-lo. O timestamp irá ajudá-lo a mostrar progresso, se é isso que você está procurando. não é uma solução inteligente.}

 2
Author: redM0nk, 2017-05-23 12:00:31
Na minha opinião, db4o é a maneira mais fácil de morrer. Aqui poderá encontrar um tutorial: http://community.versant.com/documentation/reference/db4o-7.12/java/tutorial/

E aqui você pode baixar a Biblioteca:

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

(Basta colocar o db4o-8.0...- all-java5.jar na pasta lib para a pasta lib do seu projecto. Se não existir nenhuma pasta libs no seu projecto, crie-a)

Como o db4o é um sistema de banco de dados orientado a objetos Você pode salvar diretamente objetos para a base de dados e depois obtê-los de volta.

 0
Author: fivef, 2012-06-09 15:53:55

Por favor, não se esqueça de uma coisa - os dados de armazenamento interno são apagados quando desinstalar a aplicação. Em alguns casos pode ser "recurso inesperado". Então é bom usar armazenamento externo.

Google docs about storage - por favor, Veja em particular o getExternalStoragePublicDirectory

 0
Author: user2707175, 2013-10-06 21:40:57