Pesquise algo no blog

domingo, 10 de maio de 2015

Curso Android Aula 11 - CRUD SQLite Select

Introdução

Na aula 10, iniciamos os estudos para adicionar o suporte à persistência de dados para os aplicativos Android. Foi necessário criar uma arquitetura baseada em camadas, contendo uma Model, View, Controle, DataSouce, DataModel e a DAO.

A partir da arquitetura criada, iniciamos a implementação dos métodos do CRUD sendo a insersão de dados no SQLite o primeiro que criamos. É importante que você acompanhe a séria de aulas, que teve início nas aulas 08 e 09 para ter o melhor aproveitamento deste curso.

Nesta aula, vamos buscar os dados gravados no banco de dados, para serem apresentados em uma List do tipo ListView. Para isso iremos criar também um novo layout que será acessado a  partir da tela Dashboard.

Objetivo


O objetivo desta aula é recuperar os dados gravados no banco de dados criado para a aplicação. Ao CRUD iremos implementar um método que devolve uma lista de objetos. Como teremos objetos, será possível escolher qualquer atributo do mesmo para apresentar ao usuário.

Usaremos uma formulário contendo o Widget ListView com scroll para listar os dados recebidos da consulta ao CRUD. O uso do ListView ainda não foi visto no curso, mas é algo muito simples de ser implementado e veremos passo a passo como fazê-lo.


Video demonstrativo da aplicação rodando no emulador






Criação do Projeto para esta aula.


Nosso projeto será criado utilizando a IDE Android Studio e como sugestão didática, vamos criar um novo projeto, e aprender como copiar do projeto da aula 10, apenas as pastas que queremos aproveitar o código Java, Layouts, String, Menus, etc., criados anteriormente. Esta será uma tarefa que estou introduzindo ao curso, passo a passo, com o objetivo secundário de ir ensinando utilizar o Android Studio.

Portanto, crie um projeto novo chamado CursoAndroidAula11.




O próximo passo é selecionar a versão da API Android para o projeto, e aqui quero deixar uma dica do Android Studio muito útil para os seus futuros projetos reais.

Dica do Android Studio


Quando você seleciona a versão da API, o Android Studio informa o percentual possível para o publico alvo em potencial para a sua aplicação. Observe os destaques na imagem abaixo e experimente mudar a versão da API para observar que o percentual de dispositivos muda. Atualmente menos de 1% dos aplicativos  na loja Google Play Store são compatíveis com a versão 5.x Lollipop do Android.

No caso da imagem abaixo, 33.9% dos aplicativos são compatíveis com a versão da API 19, Android 4.4 (KitKat). Já a versão IceCreamSandwich atualmente representa 90.4% dos aplicativos na loja Google Play Store.





Aproveitando o projeto da Aula 10.


Após criar o novo projeto, você deve abrir o projeto da aula 10. Será necessário que você tenha os dois projetos abertos no Android Studio. No caso de usuários do Macbook, a imagem abaixo demonstra o Android Studio com dois projetos abertos.




Organize o seu desktop para mostrar os dois projetos conforme o seu gosto. O importante é que você deixe organizado de forma a ter acesso a estrutura dos dois projetos.

A imagem abaixo demonstra como ficou no meu caso. Note que o projeto da aula 11 contém apenas os arquivos e pastas criados por padrão pelo Wizard do Android Studio.




Dica para copiar e colar.

Especificamente para este projeto, a ordem de qual pasta do projeto da aula 10 deve ser copiada primeiro não faz diferença. Minha sugestão é copiar na ordem abaixo:

Primeiro os arquivos XML.
  1. Os arquivos da pasta Values
  2. Os arquivos da pasta Menu
  3. Os arquivos da pasta Layouts
  4. Os arquivos da pasta Drawable
Segundo os arquivos código fontes Java.
  1. Os arquivos do pacote Model
  2. Os arquivos do pacote DataModel
  3. Os arquivos do pacote DAO
  4. Os arquivos do pacote DataSouce
  5. Os arquivos do pacote foo.maddo.cursoandroidaula10
Sempre que o Android Studio perguntar o que deve fazer quando a cópia estiver sendo efetuada, informe para substituir tudo.




Faça a copia de todos os arquivos da Aula 10 para as respectivas pastas do projeto da Aula 11. Para alguns arquivos, será necessário editar o caminho dos imports das classes. Na imagem acima, em destaque você pode verificar que isso foi feito. Faça isto manualmente.


Altere o conteúdo do arquivo string.xml conforme figura abaixo:




Altere o arquivo AndroidManifest.xml para adicionar a DashboardActivity.




Após concluido, rode o projeto para garantir que não ficou nada faltando. No caso de algum problema, tente resolver. E se não conseguir, deixe um compentário com detalhes.

Refatorando a DAO - Método listarDados()

Garanta que seu projeto está rodando. Agora vamos implementar mais um método do CRUD em nossa classe LoginDAO.

Na aula 10 implementamos a classe LoginDAO.java e adicionamos o método booleano adicionar(Login obj).

Nossa classe está assim até o momento.





Para recuperar os dados do banco de dados, utilizando uma instrução SQL tal como "select * from nome_da_tabela", temos que implementar um método que devolva uma coleção de objetos.

Adicione o método listarTodos() conforme demonstrado abaixo na classe LoginDAO.java. Por enquanto não iremos adicionar uma regra de negócio ao método listarTodos().




Em nossa classe DataSource, nós já deixamos implementado dois métodos genéricos. Sendo um para adicionar ou atualizar os dados, e outro para buscar os dados, estes métodos são o persist() e o find(), respectivamente.





Como você pode observar, o método find() devolve os dados na forma de um Cursor. Este método foi projetado de forma a ser o mais flexível possível. Quase tudo é passado na assinatura do método, o que nós dará inumeras possibilidades de consultas ao banco de dados. Vai depender basicamente dos dados fornecidos na chamada do método.

Vamos retornar ao método listarTodos(), mas agora efetivamente buscando os dados no banco de dados.

Implemente as regras de negócio conforme figura abaixo:




Método listarTodos() comentado


A consulta ao banco de dados para buscar todos os registros gravados na tabela Login é realizada nas linhas 59 e 60. Estamos consumindo o método find da classe DataSource, este método devolve um cursor populado com os dados. Note que foi passado apenas o nome da tabela, que em nossa arquitetura está definido na classe DataModel.getTABELA_LOGIN().

Na linha 64, estamos testando se a consulta resultou em um cursor com dados, e caso exista mais que zero registros, iniciamos a adição destes dados na lista. O método cursor.getCount() informa quantos registros existem no cursor.

Na linha 66, estamos garantindo que o ponteiro do curso está na primeira posição.

O objeto login é populado com os dados do cursor. Note que estamos transformando um objeto cursos em um objeto login, conforme código entre as linhas 72 e 74.

Após adicionar o objeto populado à lista, movemos o cursor para o próximo registro com o método cursor.moveToNext(), linha 78.

Por fim, devolvemos a lista populada com todos os registros vindos da consulta do banco de dados.

Você pode verificar se tudo está funcionando corretamente, adicionando um Log. Como desafio para o seu aprendizado, tente fazer isso e deixe um comentário se conseguiu ou não.

Criando um Layout para apresentar a Lista

Para que a lista seja apresentada, teremos que criar dois arquivos de layout.  As imagens abaixo apresentam os resultados esperados.



Para criar este layout, crie uma nova Activity chamada ListaActivity, escola o layout blank para a activity. Depois faças as alterações manualmente no arquivo XML conforme mostrado abaixo:




Nesta aula estamos introduzindo mais um Widget ao nosso curso. Note que nas linhas 11,12,13 e 14, estamos aplicando o componente ListView ao layout. Este componente irá receber a lista contendo os registros do banco de dados.

Crie mais um arquivo XML de layout, mas desta vez sem relacionar com uma Activity.





Dê o nome para o arquivo linha_list_view.xml. Digite todas as leras em caixa baixo. Não é permitido caracteres caixa aula.



Altere o arquivo XML criado para que contenha apenas TextView conforme demonstrado abaixo:




Note que na lista 2 atribuimos um ID para o TextView. Garanta que você nomeou o ID exatamente como demonstrado no exemplo, pois iremos usar este ID para montar a lista.

Refatorando a classe ListaActivity


Adicione um objeto LoginDAO para que possamos acessar o método listaTodos() e recuperar os dados gravados no banco de dados. Isso está demonstrado na linha 17 da imagem abaixo.

Note que estamos utilizando a classe ListView, e será esta classe que montará a lista com os dados a serem apresentados (linha 19).

É necessário um ArrayAdapter tipado, no caso do tipo String. Iremos popular este adapter com os dados a serem apresentados (linha 20).




Vamos programar a busca dos dados e apresentá-los ao usuário.

Como sabemos o método onCreate() de qualquer activity, é executado apenas um única vez, durante a carga da aplicação. É neste momento que preparamos os dados que serão apresentados ao usuário no Layout vinculado à Activity.




Nós criamos na classe LoginDAO o método listarDados. Este método está sendo estânciado e utilizado nas linhas 28 e 33 respectivamente.

Na linha 41, vinculamos a ListView ao Widget ListView definino no Layout activity_lista.
Na linha 43, populamos a ListView com os dados gerados a partir da consulta ao banco de dados.

Como resultato, teremos a lista demonstrada abaixo.




Refatorando o layout da tela Dashboard.


Iremos adicionar mais um ImageView e um TextView ao Dashboard, de forma a permitir que o usuário possa listar os dados gravados no banco de dados, e obviamente, gerados a partir da classe ListActivity.

O resultado final do Layout da Dashboard será este ao final desta aula.




Ícone utilizado



Adicione ao seu layout para a Activity Dashboard os componentes abaixo:



Refatorando o classe DashboardActivity.java.


Nós temos que adicionar o ImageView e implementar o método OnClickListner() para chamar a classe ListaActivity.java.

Adicionando o ImageView




Implementando o método OnClickListner()



Com o código demonstrado acima, nós implementamos o método que permitirá carregar a classe ListarActivity (linha 83).

Fontes do Projeto


Você pode fazer o download dos fontes deste projeto diretamente do repositório GitHub do curso. Mas tente antes, executar esta aula conforme apresentado. No caso de algum problema, poste suas dúvidas, relate suas dificuldades.

Use o projeto fonte como comparativo.

Download do Curso Android Aula 11

Conclusão


Nesta aula, nós implementamos o método listarTodos() do CRUD para recuperar os dados do banco de dados e apresenta o resultado em um lista. O processo de adicionar o segundo método ao CRUD foi simples de ser executada, o que requer é conhecimentos básicos da linguagem Java.

Nesta aula também é possível concluir que o uso de uma arquitetura em camada, vai tornando mais fácil a tarefa de programação através da reutilização de métodos e classes já existentes, como por exemplo, a DataModel, a DataSource e a LoginDAO.

domingo, 10 de maio de 2015

Curso Android Aula 11 - CRUD SQLite Select

Introdução

Na aula 10, iniciamos os estudos para adicionar o suporte à persistência de dados para os aplicativos Android. Foi necessário criar uma arquitetura baseada em camadas, contendo uma Model, View, Controle, DataSouce, DataModel e a DAO.

A partir da arquitetura criada, iniciamos a implementação dos métodos do CRUD sendo a insersão de dados no SQLite o primeiro que criamos. É importante que você acompanhe a séria de aulas, que teve início nas aulas 08 e 09 para ter o melhor aproveitamento deste curso.

Nesta aula, vamos buscar os dados gravados no banco de dados, para serem apresentados em uma List do tipo ListView. Para isso iremos criar também um novo layout que será acessado a  partir da tela Dashboard.

Objetivo


O objetivo desta aula é recuperar os dados gravados no banco de dados criado para a aplicação. Ao CRUD iremos implementar um método que devolve uma lista de objetos. Como teremos objetos, será possível escolher qualquer atributo do mesmo para apresentar ao usuário.

Usaremos uma formulário contendo o Widget ListView com scroll para listar os dados recebidos da consulta ao CRUD. O uso do ListView ainda não foi visto no curso, mas é algo muito simples de ser implementado e veremos passo a passo como fazê-lo.


Video demonstrativo da aplicação rodando no emulador






Criação do Projeto para esta aula.


Nosso projeto será criado utilizando a IDE Android Studio e como sugestão didática, vamos criar um novo projeto, e aprender como copiar do projeto da aula 10, apenas as pastas que queremos aproveitar o código Java, Layouts, String, Menus, etc., criados anteriormente. Esta será uma tarefa que estou introduzindo ao curso, passo a passo, com o objetivo secundário de ir ensinando utilizar o Android Studio.

Portanto, crie um projeto novo chamado CursoAndroidAula11.




O próximo passo é selecionar a versão da API Android para o projeto, e aqui quero deixar uma dica do Android Studio muito útil para os seus futuros projetos reais.

Dica do Android Studio


Quando você seleciona a versão da API, o Android Studio informa o percentual possível para o publico alvo em potencial para a sua aplicação. Observe os destaques na imagem abaixo e experimente mudar a versão da API para observar que o percentual de dispositivos muda. Atualmente menos de 1% dos aplicativos  na loja Google Play Store são compatíveis com a versão 5.x Lollipop do Android.

No caso da imagem abaixo, 33.9% dos aplicativos são compatíveis com a versão da API 19, Android 4.4 (KitKat). Já a versão IceCreamSandwich atualmente representa 90.4% dos aplicativos na loja Google Play Store.





Aproveitando o projeto da Aula 10.


Após criar o novo projeto, você deve abrir o projeto da aula 10. Será necessário que você tenha os dois projetos abertos no Android Studio. No caso de usuários do Macbook, a imagem abaixo demonstra o Android Studio com dois projetos abertos.




Organize o seu desktop para mostrar os dois projetos conforme o seu gosto. O importante é que você deixe organizado de forma a ter acesso a estrutura dos dois projetos.

A imagem abaixo demonstra como ficou no meu caso. Note que o projeto da aula 11 contém apenas os arquivos e pastas criados por padrão pelo Wizard do Android Studio.




Dica para copiar e colar.

Especificamente para este projeto, a ordem de qual pasta do projeto da aula 10 deve ser copiada primeiro não faz diferença. Minha sugestão é copiar na ordem abaixo:

Primeiro os arquivos XML.
  1. Os arquivos da pasta Values
  2. Os arquivos da pasta Menu
  3. Os arquivos da pasta Layouts
  4. Os arquivos da pasta Drawable
Segundo os arquivos código fontes Java.
  1. Os arquivos do pacote Model
  2. Os arquivos do pacote DataModel
  3. Os arquivos do pacote DAO
  4. Os arquivos do pacote DataSouce
  5. Os arquivos do pacote foo.maddo.cursoandroidaula10
Sempre que o Android Studio perguntar o que deve fazer quando a cópia estiver sendo efetuada, informe para substituir tudo.




Faça a copia de todos os arquivos da Aula 10 para as respectivas pastas do projeto da Aula 11. Para alguns arquivos, será necessário editar o caminho dos imports das classes. Na imagem acima, em destaque você pode verificar que isso foi feito. Faça isto manualmente.


Altere o conteúdo do arquivo string.xml conforme figura abaixo:




Altere o arquivo AndroidManifest.xml para adicionar a DashboardActivity.




Após concluido, rode o projeto para garantir que não ficou nada faltando. No caso de algum problema, tente resolver. E se não conseguir, deixe um compentário com detalhes.

Refatorando a DAO - Método listarDados()

Garanta que seu projeto está rodando. Agora vamos implementar mais um método do CRUD em nossa classe LoginDAO.

Na aula 10 implementamos a classe LoginDAO.java e adicionamos o método booleano adicionar(Login obj).

Nossa classe está assim até o momento.





Para recuperar os dados do banco de dados, utilizando uma instrução SQL tal como "select * from nome_da_tabela", temos que implementar um método que devolva uma coleção de objetos.

Adicione o método listarTodos() conforme demonstrado abaixo na classe LoginDAO.java. Por enquanto não iremos adicionar uma regra de negócio ao método listarTodos().




Em nossa classe DataSource, nós já deixamos implementado dois métodos genéricos. Sendo um para adicionar ou atualizar os dados, e outro para buscar os dados, estes métodos são o persist() e o find(), respectivamente.





Como você pode observar, o método find() devolve os dados na forma de um Cursor. Este método foi projetado de forma a ser o mais flexível possível. Quase tudo é passado na assinatura do método, o que nós dará inumeras possibilidades de consultas ao banco de dados. Vai depender basicamente dos dados fornecidos na chamada do método.

Vamos retornar ao método listarTodos(), mas agora efetivamente buscando os dados no banco de dados.

Implemente as regras de negócio conforme figura abaixo:




Método listarTodos() comentado


A consulta ao banco de dados para buscar todos os registros gravados na tabela Login é realizada nas linhas 59 e 60. Estamos consumindo o método find da classe DataSource, este método devolve um cursor populado com os dados. Note que foi passado apenas o nome da tabela, que em nossa arquitetura está definido na classe DataModel.getTABELA_LOGIN().

Na linha 64, estamos testando se a consulta resultou em um cursor com dados, e caso exista mais que zero registros, iniciamos a adição destes dados na lista. O método cursor.getCount() informa quantos registros existem no cursor.

Na linha 66, estamos garantindo que o ponteiro do curso está na primeira posição.

O objeto login é populado com os dados do cursor. Note que estamos transformando um objeto cursos em um objeto login, conforme código entre as linhas 72 e 74.

Após adicionar o objeto populado à lista, movemos o cursor para o próximo registro com o método cursor.moveToNext(), linha 78.

Por fim, devolvemos a lista populada com todos os registros vindos da consulta do banco de dados.

Você pode verificar se tudo está funcionando corretamente, adicionando um Log. Como desafio para o seu aprendizado, tente fazer isso e deixe um comentário se conseguiu ou não.

Criando um Layout para apresentar a Lista

Para que a lista seja apresentada, teremos que criar dois arquivos de layout.  As imagens abaixo apresentam os resultados esperados.



Para criar este layout, crie uma nova Activity chamada ListaActivity, escola o layout blank para a activity. Depois faças as alterações manualmente no arquivo XML conforme mostrado abaixo:




Nesta aula estamos introduzindo mais um Widget ao nosso curso. Note que nas linhas 11,12,13 e 14, estamos aplicando o componente ListView ao layout. Este componente irá receber a lista contendo os registros do banco de dados.

Crie mais um arquivo XML de layout, mas desta vez sem relacionar com uma Activity.





Dê o nome para o arquivo linha_list_view.xml. Digite todas as leras em caixa baixo. Não é permitido caracteres caixa aula.



Altere o arquivo XML criado para que contenha apenas TextView conforme demonstrado abaixo:




Note que na lista 2 atribuimos um ID para o TextView. Garanta que você nomeou o ID exatamente como demonstrado no exemplo, pois iremos usar este ID para montar a lista.

Refatorando a classe ListaActivity


Adicione um objeto LoginDAO para que possamos acessar o método listaTodos() e recuperar os dados gravados no banco de dados. Isso está demonstrado na linha 17 da imagem abaixo.

Note que estamos utilizando a classe ListView, e será esta classe que montará a lista com os dados a serem apresentados (linha 19).

É necessário um ArrayAdapter tipado, no caso do tipo String. Iremos popular este adapter com os dados a serem apresentados (linha 20).




Vamos programar a busca dos dados e apresentá-los ao usuário.

Como sabemos o método onCreate() de qualquer activity, é executado apenas um única vez, durante a carga da aplicação. É neste momento que preparamos os dados que serão apresentados ao usuário no Layout vinculado à Activity.




Nós criamos na classe LoginDAO o método listarDados. Este método está sendo estânciado e utilizado nas linhas 28 e 33 respectivamente.

Na linha 41, vinculamos a ListView ao Widget ListView definino no Layout activity_lista.
Na linha 43, populamos a ListView com os dados gerados a partir da consulta ao banco de dados.

Como resultato, teremos a lista demonstrada abaixo.




Refatorando o layout da tela Dashboard.


Iremos adicionar mais um ImageView e um TextView ao Dashboard, de forma a permitir que o usuário possa listar os dados gravados no banco de dados, e obviamente, gerados a partir da classe ListActivity.

O resultado final do Layout da Dashboard será este ao final desta aula.




Ícone utilizado



Adicione ao seu layout para a Activity Dashboard os componentes abaixo:



Refatorando o classe DashboardActivity.java.


Nós temos que adicionar o ImageView e implementar o método OnClickListner() para chamar a classe ListaActivity.java.

Adicionando o ImageView




Implementando o método OnClickListner()



Com o código demonstrado acima, nós implementamos o método que permitirá carregar a classe ListarActivity (linha 83).

Fontes do Projeto


Você pode fazer o download dos fontes deste projeto diretamente do repositório GitHub do curso. Mas tente antes, executar esta aula conforme apresentado. No caso de algum problema, poste suas dúvidas, relate suas dificuldades.

Use o projeto fonte como comparativo.

Download do Curso Android Aula 11

Conclusão


Nesta aula, nós implementamos o método listarTodos() do CRUD para recuperar os dados do banco de dados e apresenta o resultado em um lista. O processo de adicionar o segundo método ao CRUD foi simples de ser executada, o que requer é conhecimentos básicos da linguagem Java.

Nesta aula também é possível concluir que o uso de uma arquitetura em camada, vai tornando mais fácil a tarefa de programação através da reutilização de métodos e classes já existentes, como por exemplo, a DataModel, a DataSource e a LoginDAO.