Pesquise algo no blog

Mostrando postagens com marcador CRUD. Mostrar todas as postagens
Mostrando postagens com marcador CRUD. Mostrar todas as postagens

terça-feira, 3 de abril de 2018

Curso Desenvolvimento Android do Absoluto Zero para Iniciantes

Curso Desenvolvimento Android do Absoluto Zero para Iniciantes

Aprenda criar seus próprios aplicativos para Android, assista o vídeo para conhecer o curso.


Entre os dias 01/04/2018 e 30/04/2018 inscrevendo-se no curso você ganha um super desconto.

Valor do Curso somente no mês de Abril de 2018

R$ 29,99

Liberei 100 cupons com 95% de desconto.

Esta é a sua oportunidade de entrar para o mundo do desenvolvimento de aplicativos para Android.


Após Abril de 2018

R$ 579,99

Android - Crie aplicativos nas primeiras aulas usando SQLite, WebService, PHP, JSON, MySQL, MVC, SMS, ListView com CRUD.

Aprenda criar uma Arquitetura para Projetos Android capaz de permitir que você crie seus próprios aplicativos em poucos dias, se não, apenas algumas horas.


Resumo do conteúdo programático

  • Atualizado para o Android Studio 3.1
  • Focado em Java para Android
  • Ideal para quem está procurando um curso para Iniciantes
  • Programação em Camadas
  • Arquitetura utilizando o modelo MVC
  • Totalmente integrado com Banco de Dados SQLite
  • Crud completo
  • Totalmente integrado com WebService + PHP + JSON + MYSQL
  • Mais de 140 aulas on-line
  • Mais de 20 horas de conteúdo
  • Acesso para download de todos os códigos fontes dos projetos do curso
  • Suporte por e-mail para tira dúvidas
  • Certificado ao final do curso
  • Acesso vitalício

Quem já participa do curso

  • Acadêmicos
  • Profissionais de outras linguagens

Depoimentos de alguns dos alunos do curso










Fale direto comigo

Se você desejar falar diretamente comigo sobre este curso ou aulas VIP entre em contato utilizado o formulário de contato disponível aqui no Blog.

Marco Maddo





sábado, 15 de abril de 2017

Aprenda Criar um Crud completo com SQLite para Android


Que tal aprender criar do absoluto ZERO um projeto Android com um CRUD completo e integrado ao SQLite?



Estou preparando uma série de vídeo aulas para compartilhar com você, como eu implemento um CRUD em meus aplicativos Android. Nesta série de vídeos, irei trabalhar com o padrão MVC (Model, View e Controller), que é o padrão de projetos mais popular e mais simples utilizado para organizar seu projeto de forma que você trabalhe em camadas.

Assista o vídeo abaixo e entende o que irei lhe ensinar!





Deixe seu melhor email e recebe em breve por e-mail todas as orientações para participar deste treinamento 100% grátis


Informe seu e-mail!





Após informar seu e-mail, por favor, verifique sua caixa postal e confirme a sua inscrição para este treinamento!

A estrutura do curso que eu projetei é baseada nas centenas de e-mail e perguntas que eu recebo regularmente dos assinantes do meu canal no YouTube e aqui do Blog.

Na primeira vídeo aula você vai aprender:

  • Criar o projeto no Android Studio
  • Montar a Arquitetura para o projeto do Crud
  • Criar os pacotes para o modelo MVC
  • Criar a primeira tela do projeto que chamaremos de Tela Splash
  • Criar todas as Classes que iremos utilizar no curso
  • Criar todos os métodos necessários, mas sem nenhuma regra de negócio
  • Criar o Classe para implementar o Banco de Dados SQLite
Na segunda vídeo aula você vai aprender:


  • Implementaremos o layout da tela principal
  • Criaremos o primeiro método do CRUD, que fará a inclusão de registros no banco de dados
  • Criaremos a lista que representará o SELECT ou o Retrieve do CRUD.
  • Criaremos um contatos de registros salvos no banco de dados
Na terceira vídeo aula veremos:

  • Como implementar o método para EDITAR um registro salvo no Banco de Dados
  • Iremos atualizar a lista automaticamente toda vez que um registro for EDITADO
Na quarta aula você aprendera:

  • Como excluir um registro, no cado o DELETE do CRUD.
  • Atualizar a lista de registros e a quantidade de registros salvos
Na quinta e ultima aula você vai ter um bônus especial

  • Super dicas de programação orientada a objetos
  • Macetes do Android Studio


Vai ficar de Fora deste treinamento? 

Inscreva-se enquanto ainda tem vagas

Informe seu e-mail!







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.

sexta-feira, 1 de maio de 2015

Curso Android Aula 10 - CRUD SQLite Insert


Introdução


Esta aula é continuação das aulas 08 e da aula 09, onde criamos um formulário de login com validações dos campos. Agora iremos adicionar ao aplicativo Android a persistência dos dados no SQLite. Gravar os dados no banco de dados é uma das atividades mais importantes no meu ponto de vista. 

O Android disponibilizar suporte completo ao SQLite, que é um banco de dados customizado para aplicativos móveis, free, leve e de certa forma bastante robusto.

Esta aula além de introduzir o uso do SQLite, também contém a aplicação de vários recursos do android e rotinas comuns em aplicações Android como por exemplo, trabalhar com multiplo botões, fazer uso de interfaces do SDK Android para reduzir codificação Java.

Também estaremos implementando o conceito de programação em camadas.

Objetivo


O objetivo desta aula será iniciar a implementação de um CRUD utilizando a plataforma Android e o SQLite. Nesta aula, iremos refatorar nosso projeto para que possamos trabalhar com o SQLite.

Vamos separar em camadas os novos pacotes da aplicação. Isso tem como vantagem principal, separas as responsabilidades de cada pacotes e organizar o projeto. Iremos criar um pacote para a DAO, um para DATAMODEL e outro para a DATASOURCE. 

Video demonstrativo da aplicação rodando no emulador





Assista o video demonstrando o resultado final desta aula. No video eu mostro como visualizar os dados gravados no banco de dados e como copiar o banco de dados do emulador para o desktop do seu computador.

Fundamentação teórica


Entenda de forma bem simples e fundamental, os conceitos que iremos utilizar nesta e nas próximas aulas para implementar a persistência de dados ao nosso aplicativo Android.

O que é um CRUD?


Um CRUD nada mais é do que uma sigla para representar as operações básicas manter dados em um banco de dados. Seu significado é: Create, Retrieve, Update e Delete, o que representão respectivamente um Insert, um Select, um Update e um Delete dos scripts SQL utilizados para manipular os dados de um banco de dados relacional.

O que é DAO?


Data Access Object (DAO) é um padrão de projetos para parsistência de dados que permite separar regras de negócio das regras de acesso ao banco de dados. Em uma aplicação que utilize a arquitetura MVC, todas as funcionalidades de persistência de dados, tais como obter as conexões, mapear objetos Java para tipos de dados SQL ou executar comandos SQL, devem de responsabilidade da camada DAO do projeto.

As demais camadas não podem acessar diretamente o banco de dados, e em um cenário ideal, bem sabem como executar tarefas de persistência de dados. O que elas sabem é solicitar um serviço para as demais camadas.

O que é Data Model?


Data Model organiza e padroniza a forma como os elementos de dados se relacionam entre si. Desde elementos de documentais, como pessoas do mundo real, lugares, coisas e os relacionamentos entre elas. É um padrão necessário para garantir uma comunicação exata entre a programação orientada a objetos e o mundo real.

O que é Data Source?


Data Source é o nome dado à configuração de conexão para um banco de dados de um servidor. O nome é normalmente utilizado quando cria-se uma consulta para o banco de dados.


Protótipo da Tela de Login (Refatorada)





Nesta aula iremos adicionar mais um botão na tela principal da aplicação. Este botão quando acionado, irá salvar os dados no banco de dados respeitando as mesmas regras de validação definidas para o botão acessar. Somente com todos os dados informados nos campos Login e Senha será permitido acessar o botão SALVAR LOGIN e acessar a tela Dashboard.

Programando o botão Salvar - Primeira parte Layout




Vamos implementar as alterações necessários no layout para que possamos adicionar o botão salvar e assim programar o mesmo na activity da tela de login.

Adicione o Widget Button ao layout activity_main.xml conforme definições abaixo:





Note que o ID definido para o botão é btnSalvar. E será utilizado para implementar a programação Java do mesmo.

Observer a propriedade android:enabled="false". O botão salvar estará indisponível para o usuário, até que o mesmo informe os dados corretamente.

Compare o seu layout com o protótipo da tela apresentado na figura acima. Não é necessário que fique perfeitamente como o protótipo da aula. O importante é manter os mesmos IDs, textos, nomes de variáveis, etc.

Programando o botão Salvar - Segunda parte codificação Java


A tela de Login agora tem dois botões, e teremos que implementar duas regras de negócio além de capturar corretamente qual dos dois botões o usuáio clicou.

Isso será feito implementando a interface OnClickListener, o que irá nos permitir trabalhar com multiplos botões.

Primeiro passo para implementar a interface OnClickListener. 


Adicione o código Java apresentado na linha 16 abaixo.



Aproveite para criar o objeto btnSalvar conforme linha 24.

Segundo passo, implementar o método onClick().


Adicione o método onClick() conforme demonstrado no código abaixo. Este método irá capturar o click dos botões, e iremos programaticamente testar qual dos botões foi clicado e aplicar a regra de negócio conforme cada caso. Este método deve ser adicionado logo após o método onCreate().




Terceiro passo, refatorar o método setOnClickListener() para os dois botões.




Basicamente estamos setando para os dois botões btnAcessar e btnSalvar o método setOnClickListener(). Com esta alteração, a interface OnClickListener() ficara "ouvindo" as ações de click do usuário, e chamará o método onClick() definido no segundo passo.

Note que na linha 43, estamos vinculando o botão btnSalvar ao Widget Button do Layout.

Quarto passo, descobrir qual botão foi clicado pelo usuário.


Neste caso, usaremos a estrutura condicional switch/case para capturar qual botão foi clicado, usando o ID definido para o mesmo na criação do Layout via propriedade android:id.

Adicione a código destacado na imagem abaixo ao seu projeto.




Refatorando as regras de validação para o botão btnAcessar.


A validação consiste em testar se o usuário digitou para os campos Login e Senha as informações corretas, no caso o Login é aula@foo.maddo e a Senha android.




Na linha 88, estamos ativando o botão btnSalvar. Isso acontecerá somente se os campos digitados forem válidos.

Criação dos Pacotes para o Projeto


Talvés você ainda não percebeu, mas a estrutura dos projetos Android é semelhante ao padrão de projeto MVC, que significa Model, View e Controle.

A Model contém as classes em Java, a View contém as telas ou a interface de comunicação entre a aplicação e o usuário e a Controle contém as regras de negócios da aplicação.

Nós iremos criar um pacote para a Model e neste pacote criaremos uma classe chamada Login.java. A vantagem principal será trabalha com Objetos em nosso projeto, isso vai facilitar a manutenção, além de forçar a prática da Progrmação Orientada a Objetos em Java com Android.


Crie um pacote chamado model e adiciona a classe Login.java confome demonstrado nas figuras abaixo:


Criação do Pacote Model






Selecione o pacote foo.maddo.cursoandroidaula10 e click com o botão direito -> New -> Package.


Resultado esperado







Criação da Classe Login.java


Selecione o pacote MODEL, clique com o botão direito -> New -> Java Class e crie a classe Login.Java


Nomeando a Classe





Classe Login.java


A classe Login, conterá apenas três atributos privados, sendo o ID que será gerado toda vez que um registro for incluído ao banco de dados, um atributito String login e por último um atributo String senha. Como esta classe pertence a camada Model, ela não receberá nenhum método adicional a não ser os respectivos gets e sets.






Criação do Pacote DAO - Data Access Object - LoginDAO.Java


Esta camada receberá a classe que terá a função tratar os objetos da camada superior, no caso a VIEW representada pelas Activities Android e enviar para a DataSource para serem gravadas no Banco de Dados. A DAO também será responsável em devolver dados do banco de dados para a VIEW que solicitar.

Nesta aula iremos implementar na classe LoginDAO apenas o método adicionar() do nosso CRUD. Nas próximas aulas estaremos implementando todos os demais métodos.

Crie o pacote DAO e dentro dele a classe LoginDAO.java conforme figura abaixo:





Classe LoginDAO.Java


Esta é a estrutura da classe LoginDAO que será implementada nesta aula. Note que temos o construtor padrão da classe, e um método boleano que recebe o objeto Login na sua assinatura.

Até aqui, esta classe não contém nada de extraordinário, mas iremos "decorar" esta classe com os pré-requisitos Android para permitir a integração da DAO com o SDK Android, especificamente para efetuar a persistência dos dados no SQLite.

É muito importante para o sucesso do seu aprendizado que você perceba a evulução desta aula, se você notar, estamos construindo gradativamente a aplicação, e implementando conforme necessário as alterações na codificação Java comum para outras plataformas de desenvolvimento.




Construtor LoginDAO()


Nosso construtor será responsável em entregar um objeto de banco de dados, vindo da DataSource de forma a permitir que todos os métodos do CRUD tenham disponíveis o acesso aos métodos do SQLite para incluir, alterar, deletar ou listar os dados solicitados pela aplicação.


Método adicionar(Login obj)

Este será o primeiro método do CRUD que será implementado. Estaremos enviando um objeto Login para ser adicionado ao banco de dados. O método adicionar, é do tipo booleano. Caso o objeto seja adicionado com sucesso no Banco de Dados, retorna true, caso contrário retorna falso para a VIEW que notificará o usuário.


Criação do Pacote DataModel


Vamos adicionar mais um pacote ao nosso projeto, neste caso será o pacote DataModel. O papel deste pacote será criar a classe DataModel responsável em manter o que podemos chamar de modelo de dados, ou dicionário de dados do banco de dados, além dos scripts para criar as tabelas no SQLite.




Classe DataModel


Na classe DataModel iremos manter as definições das tabelas que serão usadas pelo Banco de Dados, os nomes dos seus atributos, os seus respectivos tipos de dados e por fim os scripts para criação das tabelas.

Todas as definições serão consumidas pela classe DataSouce, que será a próxima classe a ser implementada dentro do pacote DataSouce.




Significado dos Atributos


  • DB_NAME - Nome do banco de dados
  • TABELA_LOGIN - Nome da tabela "login"
  • ID - Nome do atributo ID
  • LOGIN - Nome do atributo LOGIN
  • SENHA - Nome do atributo SENHA
  • TIPO_TEXTO - Tipo de dados do SQLite para textos, strings, caracteres
  • TIPO_INTEIRO - Tipo de dados do SQLite para valores inteiros
  • TIPO_INTEIRO_PK - Tipo Inteiro e definição para chave primária da tabela 

Métodos 


  • criatTabelaLogin() - Retorna uma string contendo o script SQL para criar a tabela no banco de dados.


Criação do Pacote DataSouce


Este será o último pacote que iremos criar nesta aula. Nele iremos implementar a classe SQLiteOpenHelper do Android, classe responsável pela criação do Banco de Dados.

Crie um novo pacote chamado DataSource -> New -> Packege -> datasource. Em seguida, crie uma classe dentro deste pacote chamada DataSouce.java -> New -> Java Class -> DataSource.java.




Depois de um pouco de trabalho para estruturar nosso projeto nesta aula, finalmente chegamos ao foco da aula, que é implementar um Insert de um objeto no banco de dados SQLite. Todo este esforço vai valer muito a pena, pois ganharemos tempos nas próximas aulas.

Outro detalhes muito importante, é que sem você perceber, criamos uma pequena arquitetura que pode ser aproveitada em outros projetos Android.

Vamos programas nossa classe de persistência de dados, partindo do zero.

Se você criou a classe DataSouce conforme solicitado, sua classe terá a aparencia conforme figura abaixo:



O próximo passo é extender a classe SQLiteOpenHelper.



Note que o compilador reporta um erro, isso se deve pelo fato de sermos obrigados a implementar os métodos da classe SQLiteOpenHelper.

Clique na palavras reservada public e em seguida clique na Lâmpada que o Android Studio irá disponibilizar com algumas sugestões para resolver este erro.



Após surgir as sugestões, clique em Implement methods.



Serão implementados dois métodos, o onCreate() e o onUpgrade().


  • Método onCreate() - Este método será executado apenas uma única vez e caso não existe, criará o banco de dados, conforme as definições definidas na DataModel.
  • Método onUpgrade() - Este método será executado toda vez que a versão do banco de dados for alterada. Em outras palavras, caso ocorra alguma modificação na estrutura do banco de dados, este método será executado e aplicará as alterações necessárias.



Ainda temos que criar o Construtor para a classe DataSource. 









Toda vez que um objeto DataSouce for criado, o construtor espera as seguintes informações:

  • context - Usado para abrir ou criar o banco de dados
  • name - É o nome do banco de dados no sistema de arquivos, caso seja null será criado um banco de dados apenas na memória.
  • factory - Usado para criar um cursor de objetos. Se este valor for null será criado um objeto default.
  • version - Este é o númedo da versão do banco de dados, iniciado por 1. Caso este número seja alterado para 2, significa que a estrutura do banco de dados foi alterada e o método onUpgrade() será executado.

Até aqui, a única informação que temos para o construtor é o nome do banco de dados que foi definido na DataModel. Mas até agora, não é possível acessar esta informação. Devemos adicionar os métodos de acesso gets para todos os atributos da DataModel.

Crie os gets apenas para o atributos selecionados na imagem abaixo:




A classe DataModel deverá ficar conforme demonstrado abaixo:




Podemos utilizar o método getDB_NAME() para informar ao construtor da DataSouce() qual será o nome do banco de dados para a nossa aplicação. Aqui começa a demonstração da vantagem de termos criado a DataModel.









Nos resta informar o context, factory e version. Vamos criar variáveis locais para factory e version. O context será fornecido pela camada de VIEW da aplicação, ou seja, pela classe Activity que desejar persistir algum objeto no banco de dados.




Observe que estamos passando para o construtor da classe extendida SQLiteOpenHelper, o contexto da aplicação, o nome da tabela, que veio da classe DataModel.getDB_NAME(), o valor null para a cursor, e o valor 1 para a versão do banco de dados.

Classe SQLiteDataBase - Criando o banco de dados


Estamos com quase tudo pronto para finalizar criação no banco de dados. Agora necessitamos de um objeto da classe SQLiteDataBase. Será este objeto que nos fornecerá os métodos para ler e escrever no banco de dados, executar insert, upgrade, delete, etc.

Neste momento do curso, não irei aprofundar os conceitos sobre esta classe, o que é assunto de outra aula específica sobre as classes SQLiteOpenHelper e SQLiteDataBase.

Adicione as linhas em destaque abaixo ao seu código Java da classe DataSource.





  • Linha 17 - SQLiteDatabase - Cria um objeto para manipular o banco de dados contendo vários métodos comuns para rotinas de persistência de dados.
  • Linha 23 - Abre o banco de dados para leitura.
  • Linha 30 - Cria caso não exista a tabela Login no banco de dados, a partir das definições da tabela criadas na DataModel.
  • Linha 39 -  Será executada somente se a versão do banco de dados for alterada.

Método para persistência dos dados no banco de dados - persist().


Vamos criar agora um método que não está disponível nativamente no SQLite. O método que iremos criar será chamado de persist(), e sua função será, executar um insert ou um upgrade no banco de dados. O insert é tema desta aula, o upgrade será o tema da próxima aula, porém, já deixaremos o método pronto.



A lógica deste método é baseada no status do atributo ID. Se o mesmo for zero ou nulo, significa que um registro novo deve ser adicionado ao banco de dados, caso contrário, será realizado um upgrade em um registro já existente.

Note que estamos passando o nome da tabela como parâmetro na assinatura deste método, isso torna-o muito reutilizável. Como poderemos ver nesta e nas próximas aulas.

A linha 65, executa o método insert do SQLiteDatabase efetuando a inclusão dos dados no banco de dados.

Observe que temos uma novidade neste método, que é o uso da Classe ContentValues. Esta classe recebe uma lista contendo dois valores,  o primeiro é o nome do campo na tabela, e o segundo é o valor que desejamos gravar para este campo no banco de dados.

Vamos retornar ao método adicionar da classe LoginDAO para preparar os dados para serem incluídos via método persist().


Refatorando a classe LoginDAO()





A classe LoginDAO até o momento contém apenas o método adicionar(). Para que possamos enviar o objeto Login para a DataSouce, teremos que modificar o código Java desta classe.


  • Linha 16 - Estamos criando um objeto DataSource.
  • Linha 17 - Estamos criando um objeto ContentValues, requerido pelo método persist() da DataSource.
  • Linha 19 - Modificamos a assinatura do construtor da classe para receber o contexto da aplicação.
  • Linhas 29 à 32 - Estamos criando uma estância da classe ContentValues e populando o objeto com os dados a serem enviado ao banco de dados.
  • Linha 35 - Estamos executando o método persist() passando como parâmetros os valores a serem salvos e o nome da tabela de destino dos dados no banco de dados.
  • Linha 36 - Setamos o retorno como true, o que significa que os dados foram salvos com sucesso. 

Refatorando as regras de validação para o botão btnSalvar.


O botão btnAcessar é configurado no layout como desabilitado, e somente quando o usuário informar os dados corretamente, o seu status muda de desabilitado para habilitado.

Quando o botão estiver disponível para o usuário, iremos enviar os dados para a camada LoginDAO, que providenciará a preparação do objeto Login para ser gravado no banco de dados.

Se os dados forem salvos corretamente no banco de dados, a troca de tela será efetuada e a tela Dashboard será carregada.





Esta é praticamente a última parte desta aula, onde estamos implementando a regra de negócio para gravar os dados no banco de dados.

Aqui nós criamos um objeto Login, populamos o mesmo com os dados digitados pelo usuário e enviamos para a classe LoginDAO, através do método adicionar().

Como é necessário informar o contexto da aplicação para a DataSouce(), estamos fazendo isso na linha 106. O método getApplicationContext() informa o contexto atual da Activity.

O método adicionar() da classe LoginDAO, irá devolver verdadeiro ou falso, dependerá se ocorreu ou não sucesso ao gravar os dados no banco de dados.

Por último, se tudo estiver correto, trocamos de tela carregando a Dashboard.

Fontes do projeto no GitHub


Os fontes deste projeto estão disponíveis no repositório Git do curso. Para acessar, basta clicar no link abaixo:

https://github.com/profmaddo/CursoAndroidAula10

Conclusão


Persistir dados em um banco de dados é uma das tarefas mais comuns em qualquer sistema, seja ele web, desktop ou mobile. Nesta aula, além de apresentar como criar uma classe para gravar os dados no banco de dados SQLite para Android, também tivemos a oportunidade de aprofundar um pouco mais conceitos importantes sobre separação de regras de negócios em camadas, DataModel, DataSource, DAO e MVC.

Finalizamos a aula com o primeiro método do CRUD implementado. Na próxima aula irei demonstrar como visualizar os dados gravados no banco de dados conforme figura abaixo.






Mostrando postagens com marcador CRUD. Mostrar todas as postagens
Mostrando postagens com marcador CRUD. Mostrar todas as postagens

terça-feira, 3 de abril de 2018

Curso Desenvolvimento Android do Absoluto Zero para Iniciantes

Curso Desenvolvimento Android do Absoluto Zero para Iniciantes

Aprenda criar seus próprios aplicativos para Android, assista o vídeo para conhecer o curso.


Entre os dias 01/04/2018 e 30/04/2018 inscrevendo-se no curso você ganha um super desconto.

Valor do Curso somente no mês de Abril de 2018

R$ 29,99

Liberei 100 cupons com 95% de desconto.

Esta é a sua oportunidade de entrar para o mundo do desenvolvimento de aplicativos para Android.


Após Abril de 2018

R$ 579,99

Android - Crie aplicativos nas primeiras aulas usando SQLite, WebService, PHP, JSON, MySQL, MVC, SMS, ListView com CRUD.

Aprenda criar uma Arquitetura para Projetos Android capaz de permitir que você crie seus próprios aplicativos em poucos dias, se não, apenas algumas horas.


Resumo do conteúdo programático

  • Atualizado para o Android Studio 3.1
  • Focado em Java para Android
  • Ideal para quem está procurando um curso para Iniciantes
  • Programação em Camadas
  • Arquitetura utilizando o modelo MVC
  • Totalmente integrado com Banco de Dados SQLite
  • Crud completo
  • Totalmente integrado com WebService + PHP + JSON + MYSQL
  • Mais de 140 aulas on-line
  • Mais de 20 horas de conteúdo
  • Acesso para download de todos os códigos fontes dos projetos do curso
  • Suporte por e-mail para tira dúvidas
  • Certificado ao final do curso
  • Acesso vitalício

Quem já participa do curso

  • Acadêmicos
  • Profissionais de outras linguagens

Depoimentos de alguns dos alunos do curso










Fale direto comigo

Se você desejar falar diretamente comigo sobre este curso ou aulas VIP entre em contato utilizado o formulário de contato disponível aqui no Blog.

Marco Maddo





sábado, 15 de abril de 2017

Aprenda Criar um Crud completo com SQLite para Android


Que tal aprender criar do absoluto ZERO um projeto Android com um CRUD completo e integrado ao SQLite?



Estou preparando uma série de vídeo aulas para compartilhar com você, como eu implemento um CRUD em meus aplicativos Android. Nesta série de vídeos, irei trabalhar com o padrão MVC (Model, View e Controller), que é o padrão de projetos mais popular e mais simples utilizado para organizar seu projeto de forma que você trabalhe em camadas.

Assista o vídeo abaixo e entende o que irei lhe ensinar!





Deixe seu melhor email e recebe em breve por e-mail todas as orientações para participar deste treinamento 100% grátis


Informe seu e-mail!





Após informar seu e-mail, por favor, verifique sua caixa postal e confirme a sua inscrição para este treinamento!

A estrutura do curso que eu projetei é baseada nas centenas de e-mail e perguntas que eu recebo regularmente dos assinantes do meu canal no YouTube e aqui do Blog.

Na primeira vídeo aula você vai aprender:

  • Criar o projeto no Android Studio
  • Montar a Arquitetura para o projeto do Crud
  • Criar os pacotes para o modelo MVC
  • Criar a primeira tela do projeto que chamaremos de Tela Splash
  • Criar todas as Classes que iremos utilizar no curso
  • Criar todos os métodos necessários, mas sem nenhuma regra de negócio
  • Criar o Classe para implementar o Banco de Dados SQLite
Na segunda vídeo aula você vai aprender:


  • Implementaremos o layout da tela principal
  • Criaremos o primeiro método do CRUD, que fará a inclusão de registros no banco de dados
  • Criaremos a lista que representará o SELECT ou o Retrieve do CRUD.
  • Criaremos um contatos de registros salvos no banco de dados
Na terceira vídeo aula veremos:

  • Como implementar o método para EDITAR um registro salvo no Banco de Dados
  • Iremos atualizar a lista automaticamente toda vez que um registro for EDITADO
Na quarta aula você aprendera:

  • Como excluir um registro, no cado o DELETE do CRUD.
  • Atualizar a lista de registros e a quantidade de registros salvos
Na quinta e ultima aula você vai ter um bônus especial

  • Super dicas de programação orientada a objetos
  • Macetes do Android Studio


Vai ficar de Fora deste treinamento? 

Inscreva-se enquanto ainda tem vagas

Informe seu e-mail!







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.

sexta-feira, 1 de maio de 2015

Curso Android Aula 10 - CRUD SQLite Insert


Introdução


Esta aula é continuação das aulas 08 e da aula 09, onde criamos um formulário de login com validações dos campos. Agora iremos adicionar ao aplicativo Android a persistência dos dados no SQLite. Gravar os dados no banco de dados é uma das atividades mais importantes no meu ponto de vista. 

O Android disponibilizar suporte completo ao SQLite, que é um banco de dados customizado para aplicativos móveis, free, leve e de certa forma bastante robusto.

Esta aula além de introduzir o uso do SQLite, também contém a aplicação de vários recursos do android e rotinas comuns em aplicações Android como por exemplo, trabalhar com multiplo botões, fazer uso de interfaces do SDK Android para reduzir codificação Java.

Também estaremos implementando o conceito de programação em camadas.

Objetivo


O objetivo desta aula será iniciar a implementação de um CRUD utilizando a plataforma Android e o SQLite. Nesta aula, iremos refatorar nosso projeto para que possamos trabalhar com o SQLite.

Vamos separar em camadas os novos pacotes da aplicação. Isso tem como vantagem principal, separas as responsabilidades de cada pacotes e organizar o projeto. Iremos criar um pacote para a DAO, um para DATAMODEL e outro para a DATASOURCE. 

Video demonstrativo da aplicação rodando no emulador





Assista o video demonstrando o resultado final desta aula. No video eu mostro como visualizar os dados gravados no banco de dados e como copiar o banco de dados do emulador para o desktop do seu computador.

Fundamentação teórica


Entenda de forma bem simples e fundamental, os conceitos que iremos utilizar nesta e nas próximas aulas para implementar a persistência de dados ao nosso aplicativo Android.

O que é um CRUD?


Um CRUD nada mais é do que uma sigla para representar as operações básicas manter dados em um banco de dados. Seu significado é: Create, Retrieve, Update e Delete, o que representão respectivamente um Insert, um Select, um Update e um Delete dos scripts SQL utilizados para manipular os dados de um banco de dados relacional.

O que é DAO?


Data Access Object (DAO) é um padrão de projetos para parsistência de dados que permite separar regras de negócio das regras de acesso ao banco de dados. Em uma aplicação que utilize a arquitetura MVC, todas as funcionalidades de persistência de dados, tais como obter as conexões, mapear objetos Java para tipos de dados SQL ou executar comandos SQL, devem de responsabilidade da camada DAO do projeto.

As demais camadas não podem acessar diretamente o banco de dados, e em um cenário ideal, bem sabem como executar tarefas de persistência de dados. O que elas sabem é solicitar um serviço para as demais camadas.

O que é Data Model?


Data Model organiza e padroniza a forma como os elementos de dados se relacionam entre si. Desde elementos de documentais, como pessoas do mundo real, lugares, coisas e os relacionamentos entre elas. É um padrão necessário para garantir uma comunicação exata entre a programação orientada a objetos e o mundo real.

O que é Data Source?


Data Source é o nome dado à configuração de conexão para um banco de dados de um servidor. O nome é normalmente utilizado quando cria-se uma consulta para o banco de dados.


Protótipo da Tela de Login (Refatorada)





Nesta aula iremos adicionar mais um botão na tela principal da aplicação. Este botão quando acionado, irá salvar os dados no banco de dados respeitando as mesmas regras de validação definidas para o botão acessar. Somente com todos os dados informados nos campos Login e Senha será permitido acessar o botão SALVAR LOGIN e acessar a tela Dashboard.

Programando o botão Salvar - Primeira parte Layout




Vamos implementar as alterações necessários no layout para que possamos adicionar o botão salvar e assim programar o mesmo na activity da tela de login.

Adicione o Widget Button ao layout activity_main.xml conforme definições abaixo:





Note que o ID definido para o botão é btnSalvar. E será utilizado para implementar a programação Java do mesmo.

Observer a propriedade android:enabled="false". O botão salvar estará indisponível para o usuário, até que o mesmo informe os dados corretamente.

Compare o seu layout com o protótipo da tela apresentado na figura acima. Não é necessário que fique perfeitamente como o protótipo da aula. O importante é manter os mesmos IDs, textos, nomes de variáveis, etc.

Programando o botão Salvar - Segunda parte codificação Java


A tela de Login agora tem dois botões, e teremos que implementar duas regras de negócio além de capturar corretamente qual dos dois botões o usuáio clicou.

Isso será feito implementando a interface OnClickListener, o que irá nos permitir trabalhar com multiplos botões.

Primeiro passo para implementar a interface OnClickListener. 


Adicione o código Java apresentado na linha 16 abaixo.



Aproveite para criar o objeto btnSalvar conforme linha 24.

Segundo passo, implementar o método onClick().


Adicione o método onClick() conforme demonstrado no código abaixo. Este método irá capturar o click dos botões, e iremos programaticamente testar qual dos botões foi clicado e aplicar a regra de negócio conforme cada caso. Este método deve ser adicionado logo após o método onCreate().




Terceiro passo, refatorar o método setOnClickListener() para os dois botões.




Basicamente estamos setando para os dois botões btnAcessar e btnSalvar o método setOnClickListener(). Com esta alteração, a interface OnClickListener() ficara "ouvindo" as ações de click do usuário, e chamará o método onClick() definido no segundo passo.

Note que na linha 43, estamos vinculando o botão btnSalvar ao Widget Button do Layout.

Quarto passo, descobrir qual botão foi clicado pelo usuário.


Neste caso, usaremos a estrutura condicional switch/case para capturar qual botão foi clicado, usando o ID definido para o mesmo na criação do Layout via propriedade android:id.

Adicione a código destacado na imagem abaixo ao seu projeto.




Refatorando as regras de validação para o botão btnAcessar.


A validação consiste em testar se o usuário digitou para os campos Login e Senha as informações corretas, no caso o Login é aula@foo.maddo e a Senha android.




Na linha 88, estamos ativando o botão btnSalvar. Isso acontecerá somente se os campos digitados forem válidos.

Criação dos Pacotes para o Projeto


Talvés você ainda não percebeu, mas a estrutura dos projetos Android é semelhante ao padrão de projeto MVC, que significa Model, View e Controle.

A Model contém as classes em Java, a View contém as telas ou a interface de comunicação entre a aplicação e o usuário e a Controle contém as regras de negócios da aplicação.

Nós iremos criar um pacote para a Model e neste pacote criaremos uma classe chamada Login.java. A vantagem principal será trabalha com Objetos em nosso projeto, isso vai facilitar a manutenção, além de forçar a prática da Progrmação Orientada a Objetos em Java com Android.


Crie um pacote chamado model e adiciona a classe Login.java confome demonstrado nas figuras abaixo:


Criação do Pacote Model






Selecione o pacote foo.maddo.cursoandroidaula10 e click com o botão direito -> New -> Package.


Resultado esperado







Criação da Classe Login.java


Selecione o pacote MODEL, clique com o botão direito -> New -> Java Class e crie a classe Login.Java


Nomeando a Classe





Classe Login.java


A classe Login, conterá apenas três atributos privados, sendo o ID que será gerado toda vez que um registro for incluído ao banco de dados, um atributito String login e por último um atributo String senha. Como esta classe pertence a camada Model, ela não receberá nenhum método adicional a não ser os respectivos gets e sets.






Criação do Pacote DAO - Data Access Object - LoginDAO.Java


Esta camada receberá a classe que terá a função tratar os objetos da camada superior, no caso a VIEW representada pelas Activities Android e enviar para a DataSource para serem gravadas no Banco de Dados. A DAO também será responsável em devolver dados do banco de dados para a VIEW que solicitar.

Nesta aula iremos implementar na classe LoginDAO apenas o método adicionar() do nosso CRUD. Nas próximas aulas estaremos implementando todos os demais métodos.

Crie o pacote DAO e dentro dele a classe LoginDAO.java conforme figura abaixo:





Classe LoginDAO.Java


Esta é a estrutura da classe LoginDAO que será implementada nesta aula. Note que temos o construtor padrão da classe, e um método boleano que recebe o objeto Login na sua assinatura.

Até aqui, esta classe não contém nada de extraordinário, mas iremos "decorar" esta classe com os pré-requisitos Android para permitir a integração da DAO com o SDK Android, especificamente para efetuar a persistência dos dados no SQLite.

É muito importante para o sucesso do seu aprendizado que você perceba a evulução desta aula, se você notar, estamos construindo gradativamente a aplicação, e implementando conforme necessário as alterações na codificação Java comum para outras plataformas de desenvolvimento.




Construtor LoginDAO()


Nosso construtor será responsável em entregar um objeto de banco de dados, vindo da DataSource de forma a permitir que todos os métodos do CRUD tenham disponíveis o acesso aos métodos do SQLite para incluir, alterar, deletar ou listar os dados solicitados pela aplicação.


Método adicionar(Login obj)

Este será o primeiro método do CRUD que será implementado. Estaremos enviando um objeto Login para ser adicionado ao banco de dados. O método adicionar, é do tipo booleano. Caso o objeto seja adicionado com sucesso no Banco de Dados, retorna true, caso contrário retorna falso para a VIEW que notificará o usuário.


Criação do Pacote DataModel


Vamos adicionar mais um pacote ao nosso projeto, neste caso será o pacote DataModel. O papel deste pacote será criar a classe DataModel responsável em manter o que podemos chamar de modelo de dados, ou dicionário de dados do banco de dados, além dos scripts para criar as tabelas no SQLite.




Classe DataModel


Na classe DataModel iremos manter as definições das tabelas que serão usadas pelo Banco de Dados, os nomes dos seus atributos, os seus respectivos tipos de dados e por fim os scripts para criação das tabelas.

Todas as definições serão consumidas pela classe DataSouce, que será a próxima classe a ser implementada dentro do pacote DataSouce.




Significado dos Atributos


  • DB_NAME - Nome do banco de dados
  • TABELA_LOGIN - Nome da tabela "login"
  • ID - Nome do atributo ID
  • LOGIN - Nome do atributo LOGIN
  • SENHA - Nome do atributo SENHA
  • TIPO_TEXTO - Tipo de dados do SQLite para textos, strings, caracteres
  • TIPO_INTEIRO - Tipo de dados do SQLite para valores inteiros
  • TIPO_INTEIRO_PK - Tipo Inteiro e definição para chave primária da tabela 

Métodos 


  • criatTabelaLogin() - Retorna uma string contendo o script SQL para criar a tabela no banco de dados.


Criação do Pacote DataSouce


Este será o último pacote que iremos criar nesta aula. Nele iremos implementar a classe SQLiteOpenHelper do Android, classe responsável pela criação do Banco de Dados.

Crie um novo pacote chamado DataSource -> New -> Packege -> datasource. Em seguida, crie uma classe dentro deste pacote chamada DataSouce.java -> New -> Java Class -> DataSource.java.




Depois de um pouco de trabalho para estruturar nosso projeto nesta aula, finalmente chegamos ao foco da aula, que é implementar um Insert de um objeto no banco de dados SQLite. Todo este esforço vai valer muito a pena, pois ganharemos tempos nas próximas aulas.

Outro detalhes muito importante, é que sem você perceber, criamos uma pequena arquitetura que pode ser aproveitada em outros projetos Android.

Vamos programas nossa classe de persistência de dados, partindo do zero.

Se você criou a classe DataSouce conforme solicitado, sua classe terá a aparencia conforme figura abaixo:



O próximo passo é extender a classe SQLiteOpenHelper.



Note que o compilador reporta um erro, isso se deve pelo fato de sermos obrigados a implementar os métodos da classe SQLiteOpenHelper.

Clique na palavras reservada public e em seguida clique na Lâmpada que o Android Studio irá disponibilizar com algumas sugestões para resolver este erro.



Após surgir as sugestões, clique em Implement methods.



Serão implementados dois métodos, o onCreate() e o onUpgrade().


  • Método onCreate() - Este método será executado apenas uma única vez e caso não existe, criará o banco de dados, conforme as definições definidas na DataModel.
  • Método onUpgrade() - Este método será executado toda vez que a versão do banco de dados for alterada. Em outras palavras, caso ocorra alguma modificação na estrutura do banco de dados, este método será executado e aplicará as alterações necessárias.



Ainda temos que criar o Construtor para a classe DataSource. 









Toda vez que um objeto DataSouce for criado, o construtor espera as seguintes informações:

  • context - Usado para abrir ou criar o banco de dados
  • name - É o nome do banco de dados no sistema de arquivos, caso seja null será criado um banco de dados apenas na memória.
  • factory - Usado para criar um cursor de objetos. Se este valor for null será criado um objeto default.
  • version - Este é o númedo da versão do banco de dados, iniciado por 1. Caso este número seja alterado para 2, significa que a estrutura do banco de dados foi alterada e o método onUpgrade() será executado.

Até aqui, a única informação que temos para o construtor é o nome do banco de dados que foi definido na DataModel. Mas até agora, não é possível acessar esta informação. Devemos adicionar os métodos de acesso gets para todos os atributos da DataModel.

Crie os gets apenas para o atributos selecionados na imagem abaixo:




A classe DataModel deverá ficar conforme demonstrado abaixo:




Podemos utilizar o método getDB_NAME() para informar ao construtor da DataSouce() qual será o nome do banco de dados para a nossa aplicação. Aqui começa a demonstração da vantagem de termos criado a DataModel.









Nos resta informar o context, factory e version. Vamos criar variáveis locais para factory e version. O context será fornecido pela camada de VIEW da aplicação, ou seja, pela classe Activity que desejar persistir algum objeto no banco de dados.




Observe que estamos passando para o construtor da classe extendida SQLiteOpenHelper, o contexto da aplicação, o nome da tabela, que veio da classe DataModel.getDB_NAME(), o valor null para a cursor, e o valor 1 para a versão do banco de dados.

Classe SQLiteDataBase - Criando o banco de dados


Estamos com quase tudo pronto para finalizar criação no banco de dados. Agora necessitamos de um objeto da classe SQLiteDataBase. Será este objeto que nos fornecerá os métodos para ler e escrever no banco de dados, executar insert, upgrade, delete, etc.

Neste momento do curso, não irei aprofundar os conceitos sobre esta classe, o que é assunto de outra aula específica sobre as classes SQLiteOpenHelper e SQLiteDataBase.

Adicione as linhas em destaque abaixo ao seu código Java da classe DataSource.





  • Linha 17 - SQLiteDatabase - Cria um objeto para manipular o banco de dados contendo vários métodos comuns para rotinas de persistência de dados.
  • Linha 23 - Abre o banco de dados para leitura.
  • Linha 30 - Cria caso não exista a tabela Login no banco de dados, a partir das definições da tabela criadas na DataModel.
  • Linha 39 -  Será executada somente se a versão do banco de dados for alterada.

Método para persistência dos dados no banco de dados - persist().


Vamos criar agora um método que não está disponível nativamente no SQLite. O método que iremos criar será chamado de persist(), e sua função será, executar um insert ou um upgrade no banco de dados. O insert é tema desta aula, o upgrade será o tema da próxima aula, porém, já deixaremos o método pronto.



A lógica deste método é baseada no status do atributo ID. Se o mesmo for zero ou nulo, significa que um registro novo deve ser adicionado ao banco de dados, caso contrário, será realizado um upgrade em um registro já existente.

Note que estamos passando o nome da tabela como parâmetro na assinatura deste método, isso torna-o muito reutilizável. Como poderemos ver nesta e nas próximas aulas.

A linha 65, executa o método insert do SQLiteDatabase efetuando a inclusão dos dados no banco de dados.

Observe que temos uma novidade neste método, que é o uso da Classe ContentValues. Esta classe recebe uma lista contendo dois valores,  o primeiro é o nome do campo na tabela, e o segundo é o valor que desejamos gravar para este campo no banco de dados.

Vamos retornar ao método adicionar da classe LoginDAO para preparar os dados para serem incluídos via método persist().


Refatorando a classe LoginDAO()





A classe LoginDAO até o momento contém apenas o método adicionar(). Para que possamos enviar o objeto Login para a DataSouce, teremos que modificar o código Java desta classe.


  • Linha 16 - Estamos criando um objeto DataSource.
  • Linha 17 - Estamos criando um objeto ContentValues, requerido pelo método persist() da DataSource.
  • Linha 19 - Modificamos a assinatura do construtor da classe para receber o contexto da aplicação.
  • Linhas 29 à 32 - Estamos criando uma estância da classe ContentValues e populando o objeto com os dados a serem enviado ao banco de dados.
  • Linha 35 - Estamos executando o método persist() passando como parâmetros os valores a serem salvos e o nome da tabela de destino dos dados no banco de dados.
  • Linha 36 - Setamos o retorno como true, o que significa que os dados foram salvos com sucesso. 

Refatorando as regras de validação para o botão btnSalvar.


O botão btnAcessar é configurado no layout como desabilitado, e somente quando o usuário informar os dados corretamente, o seu status muda de desabilitado para habilitado.

Quando o botão estiver disponível para o usuário, iremos enviar os dados para a camada LoginDAO, que providenciará a preparação do objeto Login para ser gravado no banco de dados.

Se os dados forem salvos corretamente no banco de dados, a troca de tela será efetuada e a tela Dashboard será carregada.





Esta é praticamente a última parte desta aula, onde estamos implementando a regra de negócio para gravar os dados no banco de dados.

Aqui nós criamos um objeto Login, populamos o mesmo com os dados digitados pelo usuário e enviamos para a classe LoginDAO, através do método adicionar().

Como é necessário informar o contexto da aplicação para a DataSouce(), estamos fazendo isso na linha 106. O método getApplicationContext() informa o contexto atual da Activity.

O método adicionar() da classe LoginDAO, irá devolver verdadeiro ou falso, dependerá se ocorreu ou não sucesso ao gravar os dados no banco de dados.

Por último, se tudo estiver correto, trocamos de tela carregando a Dashboard.

Fontes do projeto no GitHub


Os fontes deste projeto estão disponíveis no repositório Git do curso. Para acessar, basta clicar no link abaixo:

https://github.com/profmaddo/CursoAndroidAula10

Conclusão


Persistir dados em um banco de dados é uma das tarefas mais comuns em qualquer sistema, seja ele web, desktop ou mobile. Nesta aula, além de apresentar como criar uma classe para gravar os dados no banco de dados SQLite para Android, também tivemos a oportunidade de aprofundar um pouco mais conceitos importantes sobre separação de regras de negócios em camadas, DataModel, DataSource, DAO e MVC.

Finalizamos a aula com o primeiro método do CRUD implementado. Na próxima aula irei demonstrar como visualizar os dados gravados no banco de dados conforme figura abaixo.