Guia de primeiros passos do Android SDK ||Capítulo 10 Dados do aplicativo

Capítulo 10 Dados do Aplicativo

Já estamos familiarizados com a estrutura e os componentes básicos de um aplicativo Android, incluindo recursos, manifestos e interfaces de usuário. Depois de embarcar no desenvolvimento de aplicativos funcionais na plataforma Android, com certeza todos precisarão salvar esta ou aquela informação de dados. A plataforma Android oferece uma variedade de opções para lidar com tarefas de armazenamento de dados em aplicativos, e este é o conteúdo principal do artigo de hoje.

Em termos gerais, existem cinco tipos principais de opções de armazenamento de dados em aplicativos Android: salvar dados nas preferências compartilhadas do aplicativo, salvar dados no armazenamento interno (privado do próprio aplicativo) e salvar dados no armazenamento externo (exposto ao dispositivo). armazenado em um banco de dados e armazenado em um recurso da web acessível através da conexão do dispositivo com a Internet. Devido às limitações de espaço, não podemos discutir essas opções em detalhes, mas resumiremos as características básicas de cada solução para ajudá-lo a esclarecer a solução para problemas de armazenamento quando precisar usar dados persistentes.

1. Preferências compartilhadas

Primeiro passo

As preferências compartilhadas permitem que todos salvem tipos de dados básicos na forma de pares de valores-chave. O arquivo de preferências compartilhadas de um aplicativo é frequentemente considerado a opção mais simples de armazenamento de dados, mas por sua natureza impõe algumas restrições sobre o que pode ser armazenado. Você pode usá-lo para armazenar tipos básicos de números (como inteiros, números longos e números de ponto flutuante), valores booleanos e strings de texto. Precisamos atribuir um nome a cada valor que salvamos para que possamos recuperá-lo quando o aplicativo estiver em execução. Como é provável que você use preferências compartilhadas no primeiro aplicativo que criar, nós nos concentramos nelas e as descrevemos com mais detalhes do que as outras opções para ajudá-lo a solidificar o conhecimento necessário.

Você pode testar esse código em sua classe Activity principal e testá-lo mais tarde ao executar os exemplos de aplicativos nesta série de tutoriais. Idealmente, as preferências compartilhadas devem ser consistentes com as opções de configuração do usuário no aplicativo, assim como a seleção das configurações de aparência. Você ainda deve se lembrar que certa vez criamos um botão simples que exibia o texto “Ai” na tela depois que o usuário clicasse nele. Agora vamos supor que queremos que a palavra "Ai" apareça continuamente no botão depois que o usuário clicar nele uma vez e que esse estado permaneça inalterado enquanto o aplicativo estiver em execução. Isso significa que o texto inicial do botão só existe até o usuário clicar na ação pela primeira vez.

Vamos adicionar preferências compartilhadas ao nosso aplicativo. No início da aula, antes do método onCreate, escolhemos um nome para a preferência compartilhada:

public static final String MY_APP_PREFS = "MyAppPrefs"

Usando o modificador "public static", podemos acessar essa variável em qualquer classe da aplicação, então só precisamos salvar a string do nome da preferência aqui. Usamos letras maiúsculas porque a variável é uma constante, e é por isso que existe o modificador "final". Todos devem usar o mesmo nome sempre que recuperarem ou definirem uma entrada de dados nas preferências do aplicativo.

Passo 2

Agora vamos escrever o conteúdo das preferências compartilhadas. Em nosso método onClick, abaixo das configurações de texto do botão "Ai", tente recuperar essa preferência compartilhada pelo nome:

SharedPreferences thePrefs = getSharedPreferences(MY_APP_PREFS, 0);

Você precisa adicionar uma importação para a classe "android.conent.SharedPreferences". Passe o mouse sobre o texto "SharedPreferences" e use o prompt do Eclipse para concluir a importação. O primeiro parâmetro é o nome da preferência que definimos e o segundo parâmetro é o modo base que usamos como opção padrão.

Agora precisamos especificar um editor para as preferências compartilhadas para definir os valores:

SharedPreferences.Editor prefsEd = thePrefs.edit();

Agora podemos escrever valores nas preferências compartilhadas:

prefsEd.putBoolean("btnPressed", true);

Aqui usamos um tipo booleano porque existem apenas dois estados atuais - o usuário pressionou o botão ou ainda não. O editor fornece vários tipos diferentes dos quais podemos escolher manter esse conjunto de preferências compartilhadas, cada uma com seu próprio nome e parâmetros de valor. Finalmente, precisamos enviar os resultados da edição:

prefsEd.commit();

terceiro passo

Agora vamos usar o valor salvo para detectar o que o botão deve exibir quando o usuário executar a aplicação. Adicione preferências compartilhadas após o código existente em onCreate:

SharedPreferences thePrefs = getSharedPreferences(MY_APP_PREFS, 0);

Desta vez não precisamos usar um editor porque só precisamos obter um valor:

boolean pressed = thePrefs.getBoolean("btnPressed", false);

Agora recuperamos o valor usando o nome que definimos e lemos o resultado na variável. Caso o valor não tenha sido definido, é retornado o segundo parâmetro, que é o valor padrão - representando um significado negativo. Agora vamos usar este valor:

if(pressed) theButton.setText("Ouch");

Se o usuário pressionar o botão após a execução do aplicativo, o botão exibirá a palavra "Ai" diretamente. Nos artigos subsequentes desta série, você verá como realizamos essa operação enquanto o aplicativo está em execução. Este exemplo simples ilustra muito bem o uso de preferências compartilhadas. Você descobrirá que as preferências compartilhadas desempenham um papel importante para ajudar seu aplicativo a atender às preferências dos usuários por meio da aparência do seu aplicativo.

2. Arquivos internos privados

Primeiro passo

Você pode salvar arquivos no armazenamento interno e externo do dispositivo do usuário. Se você salvar um arquivo no armazenamento interno, o sistema Android o tratará como dados privados específicos do aplicativo atual. Esses arquivos fazem basicamente parte do aplicativo e não podemos acessá-los diretamente fora do aplicativo. Além disso, se o aplicativo for removido, esses arquivos também serão apagados.

Você pode criar um arquivo no armazenamento de memória usando a seguinte rotina de saída:

FileOutputStream fileOut = openFileOutput("my_file", Context.MODE_PRIVATE);

Você precisa importar e adicionar a classe "java.io.FileOutputStream". Fornecemos o nome e o modo do arquivo, escolher o modo privado significa que o arquivo será usado apenas por este aplicativo. Se você adicionar esta parte do código à Activity agora, por exemplo no método onClick, o Eclipse exibirá uma mensagem de erro. Isso ocorre porque quando realizamos operações de entrada/saída, a aplicação pode encontrar alguns erros que precisam ser corrigidos. Se suas operações de entrada/saída não conseguirem resolver esse tipo de erro, o Eclipse solicitará uma situação anormal e o aplicativo irá parar de ser executado. Para garantir que o aplicativo ainda possa ser executado normalmente neste caso, precisamos agrupar nosso código de entrada/saída em um bloco try:

try{
    FileOutputStream fileOut = openFileOutput("my_file", Context.MODE_PRIVATE);
}
catch(IOException ioe){ 
    Log.e("APP_TAG", "IO Exception", ioe);
}

Se a operação de entrada/saída resultar em uma exceção, o código acima no bloco catch será executado, gravando assim a mensagem de erro no log. No futuro, você usará frequentemente a classe Log no aplicativo (importar 'android.util.Log'), que registrará as condições específicas que ocorrem quando o código é executado. Podemos definir uma variável de classe para o rótulo da string, que é o primeiro parâmetro no código acima. Dessa forma, quando ocorrer um erro, todos poderão visualizar as informações da exceção no Android LogCat.

Passo 2

Agora, de volta ao bloco try, após criar a rotina de saída do arquivo, você pode tentar escrever o seguinte código no arquivo:

String fileContent = "my data file content"
fileOut.write(fileContent.getBytes());

Depois de escrever todo o conteúdo necessário no arquivo de dados, conclua com o seguinte código:

fileOut.close();

terceiro passo

Quando precisar recuperar o conteúdo do arquivo interno, você pode fazer isso através do seguinte processo:

try{
    FileInputStream fileIn = openFileInput("my_file");
    //read the file
}
catch(IOException ioe){ 
    Log.e("APP_TAG", "IO Exception", ioe);
}

No bloco try, use o leitor em buffer para ler o conteúdo do arquivo:

InputStreamReader streamIn = new InputStreamReader(fileIn);
BufferedReader fileRead = new BufferedReader(streamIn);
StringBuilder fileBuild = new StringBuilder("");
String fileLine=fileRead.readLine();
while(fileLine!=null){
    fileBuild.append(fileLine+"\n");
    fileLine=fileRead.readLine();
}
String fileText = fileBuild.toString();
streamIn.close();

Não se deixe intimidar pelo grande número de objetos diferentes envolvidos; na verdade, esta é uma operação de entrada/saída Java padrão. O loop while será executado uma vez para cada linha do arquivo. Após a conclusão da execução, a variável “fileText” salvará o conteúdo do arquivo como uma string para nosso uso direto.

3. Arquivos externos públicos

Primeiro passo

Nosso aplicativo também pode salvar arquivos em armazenamento externo, desde que o dispositivo do usuário suporte isso. Existem muitos tipos de armazenamento externo, incluindo cartões SD, outras mídias portáteis ou mecanismos de armazenamento de memória que não podem ser removidos pelo usuário, mas são reconhecidos pelo sistema como um tipo externo. Quando salvamos arquivos em armazenamento externo, seu conteúdo é totalmente público e você não pode impedir de forma alguma que usuários ou outros aplicativos os acessem.

Antes de tentarmos salvar dados em armazenamento externo, devemos primeiro verificar se o mecanismo de armazenamento correspondente está disponível - é definitivamente uma boa prática tentar evitar situações inesperadas:

String extStorageState = Environment.getExternalStorageState();

O sistema retornará as informações em forma de string, que você poderá analisar e comparar com o campo de status do armazenamento externo na classe Ambiente:

if(Environment.MEDIA_MOUNTED.equals(extStorageState)){
    //ok to go ahead and read/ write to external storage
}
else if(Environment.MEDIA_MOUNTED_READ_ONLY.equals(extStorageState)){
    //can only read
}
else{
    //cannot read or write
}

Mesmo que exista armazenamento externo no dispositivo, não podemos presumir que os aplicativos possam gravar dados nele.

Passo 2

Depois de confirmar que realmente podemos gravar dados no armazenamento externo, em seguida você precisa pesquisar o diretório para especificar onde o arquivo foi salvo. As seguintes configurações do aplicativo apontam para API de nível 8 e superior:

File myFile = new File(getExternalFilesDir(null), "MyFile.txt");

Desta forma, todos podem escrever e ler o arquivo. Mas não se esqueça de adicionar as seguintes restrições no arquivo de manifesto do projeto:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

À medida que os aplicativos que desenvolvemos se tornam mais complexos, você pode querer compartilhar seus arquivos salvos com outros aplicativos. Nesse caso, você pode usar as entradas comuns do diretório público, como imagens e arquivos de música.

4. Banco de dados

Como nossos aplicativos envolvem dados estruturados cada vez mais complexos, preferências compartilhadas ou arquivos internos/externos podem não atender mais às necessidades reais. Neste momento, você deve considerar o uso de uma solução de banco de dados. O Android oferece suporte aos desenvolvedores para criar e acessar bancos de dados SQLite dentro de aplicativos. Quando criamos um banco de dados, ele será usado como um componente privado para atender apenas aplicações relacionadas.

Existem muitas maneiras de usar o banco de dados SQLite em aplicativos Android. É recomendável usar a classe que estende SQLiteOpenHelper para atender a esse requisito. Nesta classe, precisamos definir as propriedades do banco de dados e criar diversas variáveis ​​de classe (incluindo o nome da lista do banco de dados que definimos e sua string de criação SQL).O código específico é o seguinte:

private static final String NOTE_TABLE_CREATE = 
    "CREATE TABLE Note (noteID INTEGER PRIMARY KEY AUTOINCREMENT, " +
    "noteTxt TEXT);";

O exemplo dado aqui envolve apenas um conjunto muito simples de tabelas, que contém duas colunas, uma coluna contém ID e a outra contém texto; ambas as colunas são usadas para registrar informações de anotação do usuário. Na classe SQLiteOpenHelper, você pode substituir o método onCreate para criar seu próprio banco de dados. Em outras partes do aplicativo, como a classe Activity, você pode acessar o banco de dados por meio de SQLiteOpenHelper, inserir novos registros usando o método WritableDatabase, consultar registros existentes usando o método getReadableDatabase e, em seguida, exibir os resultados na UI do aplicativo.

Ao iterar os resultados da consulta, nosso aplicativo usará a classe Cursor, que faz referência a cada linha no conjunto de resultados por vez.

5. Dados da Internet

Muitas aplicações utilizam recursos de dados da Internet, e algumas aplicações são compostas basicamente por um conjunto de interfaces e um grande número de fontes de dados da Web. Você pode usar a conexão com a Internet no dispositivo do usuário para armazenar e recuperar dados da Web. Este mecanismo funcionará normalmente enquanto a conexão com a Internet for válida. Para conseguir isso, precisamos adicionar a permissão "android.permission.INTERNET" em nosso arquivo de manifesto.

Se quisermos que nosso aplicativo obtenha dados da Internet, devemos garantir que esse processo seja separado do thread de UI principal do aplicativo. Usando AsyncTask, você pode obter dados de fontes da Web por meio de um processo em segundo plano, gravar os resultados na IU após a conclusão do download dos dados e, finalmente, permitir que a IU execute suas funções normalmente.

Você também pode adicionar uma classe AsyncTask interna à classe Activity e criar uma instância AsyncTask na Activity quando precisar obter dados. Ao introduzir os métodos doInBackground e onPostExecute em AsyncTask, você pode recuperar os dados obtidos na Activity e gravá-los na interface do usuário.

A obtenção de dados da web é uma tarefa moderadamente difícil no desenvolvimento de aplicativos. É melhor tentar depois de dominar o conhecimento de desenvolvimento Android. No entanto, em breve você descobrirá que esse mecanismo de aquisição de dados é muito adequado para muitas aplicações, porque pode utilizar efetivamente os recursos de conexão do dispositivo do usuário. Tanto Java quanto Android fornecem ferramentas para processar os dados estruturados retornados – como um feed JSON.

para concluir

No artigo de hoje, temos uma compreensão básica das soluções de armazenamento de dados que precisamos abordar ao desenvolver aplicativos Android. Independentemente da solução que você escolher, você deve usar as necessidades reais como padrão de referência, porque diferentes soluções são adequadas apenas para necessidades específicas. Na próxima parte desta série de tutoriais, exploraremos como conectar dispositivos físicos a uma instalação instalada do Eclipse e aprenderemos como criar dispositivos virtuais. Depois disso, também exploraremos como fazer aplicativos rodarem em ambos os tipos de dispositivos. A propósito, gostaria de informar que em mais dois artigos esta série de tutoriais terminará completamente; no último artigo estudaremos as classes comuns e o ciclo de vida da atividade Android para ajudá-lo a se preparar para desenvolver aplicativos .

Acho que você gosta

Origin blog.csdn.net/m0_69824302/article/details/132698882
Recomendado
Clasificación