Usar SQL para ler e gravar em um banco de dados

1. Antes de começar

Muitos apps que você usa armazenam dados diretamente no dispositivo. O app Relógio armazena seus alarmes recorrentes, o Google Maps salva uma lista das pesquisas recentes e o app Contatos permite adicionar, editar e remover as informações dos contatos.

A persistência de dados (o armazenamento ou a retenção de dados no dispositivo) é uma parte importante do desenvolvimento para Android. Os dados persistentes garantem que o conteúdo gerado pelo usuário não seja perdido quando o app for fechado ou que os dados transferidos por download da Internet sejam salvos e não seja necessário fazer o download novamente.

O SQLite é uma forma comum de armazenar os dados fornecida pelo SDK para apps Android. Ele oferece um banco de dados relacional que permite representar dados de maneira semelhante à estruturação de dados com classes do Kotlin. Este codelab ensina os princípios básicos da linguagem de consulta estruturada (SQL) que, embora não seja uma linguagem de programação real, oferece uma maneira simples e flexível de ler e modificar um banco de dados SQLite com apenas algumas linhas de código.

Depois de adquirir um conhecimento básico de SQL, você vai poder usar a biblioteca do Room para adicionar persistência aos seus apps mais adiante nesta unidade.

2. Principais conceitos dos bancos de dados relacionais

O que é um banco de dados?

Se você usa um editor de planilhas como as Planilhas Google, já conhece a analogia básica de um banco de dados.

Uma planilha consiste em tabelas de dados separadas ou planilhas individuais na mesma pasta de trabalho.

53f9d2168dd215a.png

Cada tabela é formada por colunas que definem o que os dados significam e linhas que representam itens individuais com valores em cada coluna. Por exemplo, você pode definir colunas para o ID, o nome, o curso e a nota de um estudante.

10f380969af48ad7.png

Cada linha contém dados de um único estudante, com valores para cada uma das colunas.

d57c3aae74e36df7.png

Um banco de dados relacional funciona da mesma forma.

  • As tabelas definem agrupamentos de dados de alto nível que você quer representar, como estudantes e professores.
  • As colunas definem os dados que cada linha da tabela contém.
  • As linhas contêm os dados reais que consistem em valores para cada coluna na tabela.

A estrutura de um banco de dados relacional também é semelhante ao que você já sabe sobre classes e objetos no Kotlin.

data class Student(
    id: Int,
    name: String,
    major: String,
    gpa: Double
)
  • As classes, como as tabelas, modelam os dados que você quer representar no seu app.
  • As propriedades, como as colunas, definem os dados específicos que cada instância da classe precisa conter.
  • Os objetos, como as linhas, são os dados reais. Os objetos contêm valores para cada propriedade definida na classe, assim como as linhas contêm valores para cada coluna definida na tabela de dados.

Da mesma forma que uma planilha pode ter várias páginas e um app várias classes, um banco de dados pode ter várias tabelas. Um banco de dados é chamado de relacional quando consegue modelar relações entre tabelas. Por exemplo, um estudante universitário pode ter um único professor como orientador, enquanto esse professor pode ser orientador de vários outros estudantes.

633f2ba54b3e6ed3.png

Cada tabela em um banco de dados relacional contém um identificador exclusivo para linhas, como uma coluna em que o valor em cada linha é um número inteiro incrementado automaticamente. Esse identificador é conhecido como chave primária.

Quando uma tabela se refere à chave primária de outra, ela é conhecida como chave externa. A presença de uma chave externa indica que há uma relação entre as tabelas.

O que é SQLite?

SQLite é um banco de dados relacional usado com frequência. Especificamente, SQLite se refere a uma biblioteca C leve para gerenciamento de bancos de dados relacionais com linguagem de consulta estruturada, conhecida como SQL, e, às vezes, pronunciada como "sequel".

Você não vai precisar aprender sobre C ou qualquer linguagem de programação totalmente nova para trabalhar com um banco de dados relacional. SQL é apenas uma maneira de adicionar e extrair dados de um banco de dados relacional com apenas algumas linhas de código.

Como representar dados com SQLite

No Kotlin, você já conhece os tipos de dados, como Int e Boolean. Os bancos de dados SQLite também usam tipos de dados. As colunas da tabela de dados precisam ter um tipo de dados específico. A tabela abaixo mapeia tipos de dados comuns do Kotlin para os equivalentes do SQLite.

Tipo de dado de Kotlin

Tipo de dados SQLite

Int

INTEIRO

String

VARCHAR ou TEXTO

Boolean

BOOLEANO

Float, Double

REAL

As tabelas em um banco de dados e as colunas em cada tabela são conhecidas coletivamente como esquema. Na próxima seção, você vai fazer o download do conjunto de dados inicial e aprender mais sobre o esquema.

3. Fazer o download do conjunto de dados inicial

O banco de dados deste codelab serve para um app de e-mails hipotético. Este codelab usa exemplos conhecidos, como classificar e filtrar e-mails ou pesquisar por assunto ou remetente, para demonstrar todos os recursos avançados de SQL. Esse exemplo também garante que você tenha experiência com os tipos de cenários que pode encontrar em um app antes de trabalhar com o Room no próximo módulo.

Faça o download do projeto inicial na ramificação compose do repositório de noções básicas do SQL do GitHub neste link (em inglês).

Usar o Database Inspector

Para usar o Database Inspector, siga estas etapas:

  1. Execute o app SQL Basics no Android Studio. Quando o app for iniciado, a tela abaixo vai aparecer.

d690089213a4532a.png

  1. No Android Studio, clique em View > Tool Windows > App Inspection.

60fc0624e36ae5c5.png

Agora você vai encontrar uma nova guia na parte de baixo com o rótulo App Inspection com a guia Database Inspector selecionada. Há outras duas guias, mas você não precisa usá-las. Pode demorar alguns segundos para carregar, mas você terá uma lista à esquerda com as tabelas de dados, que podem ser selecionadas para fazer consultas.

62e40b1283305adc.png

  1. Clique no botão Open New Query Tab para abrir um painel e executar uma consulta no banco de dados.

240118470c9474a5.png

A tabela email tem sete colunas:

  • id: a chave primária.
  • subject: a linha de assunto do e-mail.
  • sender: o endereço de origem do e-mail.
  • folder: a pasta em que a mensagem pode ser encontrada, como Caixa de entrada ou Spam.
  • starred: se o usuário marcou ou não o e-mail com estrela.
  • read: se o usuário leu ou não o e-mail.
  • received: o carimbo de data/hora em que o e-mail foi recebido.

4. Ler dados com uma instrução SELECT

Instrução SQL SELECT

Uma instrução SQL, às vezes chamada de consulta, é usada para ler ou manipular um banco de dados.

Você lê dados de um banco de dados SQLite com uma instrução SELECT. Uma instrução SELECT simples consiste na palavra-chave SELECT, seguida do nome da coluna, da palavra-chave FROM e do nome da tabela. Todas as instruções SQL terminam com ponto e vírgula (;).

bf764b3332b1664c.png

Uma instrução SELECT também pode retornar dados de várias colunas. Os nomes das colunas precisam ser separados por vírgula.

d665cb1ed84a1364.png

Se você quiser selecionar todas as colunas na tabela, use o caractere curinga (*) no lugar dos nomes das colunas.

c12711257d24fda2.png

Em ambos os casos, uma instrução SELECT simples como essa retorna todas as linhas na tabela. Basta especificar os nomes das colunas que você quer que sejam retornadas.

Ler dados de e-mail usando uma instrução SELECT

Uma das principais tarefas de um app de e-mails é mostrar uma lista de mensagens. Com um banco de dados SQL, é possível acessar essas informações com uma instrução SELECT.

  1. Verifique se a tabela email está selecionada no Database Inspector.

128347218e04faa0.png

  1. Primeiro, tente selecionar todas as colunas de cada linha na tabela email.
SELECT * FROM email;
  1. Clique no botão Run no canto inferior direito da caixa de texto. Observe que toda a tabela email é retornada.

6c99eb1ea42233a7.png

  1. Agora, selecione apenas o assunto de cada linha.
SELECT subject FROM email;
  1. Mais uma vez, a consulta retorna todas as linhas, mas somente para essa coluna.

dd3d50f00e05d506.png

  1. Também é possível selecionar várias colunas. Tente selecionar o assunto e o remetente.
SELECT subject, sender FROM email;
  1. A consulta retorna todas as linhas tabela de email, mas apenas os valores do assunto e da coluna do remetente.

68b714377cc3697f.png

Parabéns! Você acabou de executar sua primeira consulta. Nada mal, mas foi só o começo. Praticamente um tutorial "Hello World" do SQL.

É possível ser muito mais específico com instruções SELECT, adicionando cláusulas para especificar um subconjunto dos dados e até mesmo mudar a formatação da saída. Nas próximas seções, você vai aprender sobre as cláusulas mais usadas das instruções SELECT e como formatar dados.

5. Usar instruções SELECT com funções de agregação e valores distintos

Reduzir colunas com funções de agregação

As instruções SQL não se limitam a linhas de retorno. O SQL oferece várias funções que podem executar uma operação ou um cálculo em uma coluna específica, como encontrar o valor máximo ou contar o número de valores exclusivos possíveis para uma determinada coluna. Elas são chamadas de funções de agregação. Em vez de retornar todos os dados de uma coluna específica, você pode retornar um único valor de uma coluna específica.

Confira alguns exemplos de funções de agregação SQL:

  • COUNT(): retorna o número total de linhas que correspondem à consulta.
  • SUM(): retorna a soma dos valores de todas as linhas na coluna selecionada.
  • AVG(): retorna o valor médio (a média) de todos os valores na coluna selecionada.
  • MIN(): retorna o menor valor na coluna selecionada.
  • MAX(): retorna o maior valor na coluna selecionada.

Em vez de um nome de coluna, chame uma função agregada e transmita um nome de coluna como argumento entre parênteses.

6730a62d583a0d9.png

Em vez de retornar o valor dessa coluna para cada linha na tabela, um único valor vai ser retornado ao chamar a função agregada.

As funções de agregação podem ser uma forma eficiente de realizar cálculos de valor quando você não precisa ler todos os dados em um banco de dados. Por exemplo, você talvez queira descobrir manualmente a média dos valores em uma coluna sem carregar todo o banco de dados em uma lista.

Vamos conferir algumas das funções de agregação em ação com a tabela email:

  1. Um app pode querer saber o número total de e-mails recebidos. Para fazer isso, use a função COUNT() e o caractere curinga (*).
SELECT COUNT(*) FROM email;
  1. A consulta retorna um único valor. É possível fazer isso inteiramente com uma consulta SQL, sem nenhum código Kotlin para contar as linhas manualmente.

1717e824b948609d.png

  1. Para conferir o horário da mensagem mais recente, use a função MAX() na coluna recebida porque o carimbo de data/hora Unix mais recente é o número mais alto.
SELECT MAX(received) FROM email;
  1. A consulta retorna um único resultado, o maior carimbo de data/hora (o mais recente) na coluna recebida.

d9778e3a3ef33931.png

Filtrar resultados duplicados com DISTINCT

Ao selecionar uma coluna, é possível usar a palavra-chave DISTINCT antes da instrução. Essa abordagem pode ser útil quando você quer remover cópias do resultado da consulta.

20fdd229ad44926b.png

Por exemplo, muitos apps de e-mail têm um recurso de preenchimento automático para endereços. É recomendável incluir todos os endereços de que você já recebeu um e-mail e mostrá-los em uma lista.

  1. Execute a consulta abaixo para retornar a coluna sender para cada linha.
SELECT sender FROM email;
  1. O resultado contém muitas cópias. Essa não é uma experiência ideal.

752f20baacde5346.png

  1. Adicione a palavra-chave DISTINCT antes da coluna do remetente e execute a consulta novamente.
SELECT DISTINCT sender FROM email;
  1. O resultado é muito menor, e cada valor é único.

f7ec818c72d5c65b.png

Também é possível usar a palavra-chave DISTINCT antes do nome da coluna em uma função agregada.

23d94cacbdbb5be2.png

Digamos que você queira saber o número de remetentes únicos no banco de dados. É possível contar o número de remetentes únicos com a função agregada COUNT() e a palavra-chave DISTINCT na coluna sender.

  1. Execute uma instrução SELECT, transmitindo DISTINCT sender para a função COUNT().
SELECT COUNT(DISTINCT sender) FROM email;
  1. A consulta informa que há 14 remetentes únicos.

6e1362de8bb3915f.png

6. Filtrar consultas com uma cláusula WHERE

Muitos apps de e-mail oferecem o recurso de filtrar as mensagens mostradas com base em determinados critérios, como dados, termo de pesquisa, pasta, remetente etc. Para esses tipos de casos de uso, é possível adicionar uma cláusula WHERE na consulta SELECT.

Após o nome da tabela, em uma nova linha, adicione a palavra-chave WHERE seguida por uma expressão. Ao escrever consultas SQL mais complexas, é comum colocar cada cláusula em uma nova linha para facilitar a leitura.

2c1a6a495ceb4ab5.png

Essa consulta executa uma verificação booleana para cada linha selecionada. Se a verificação retornar "true", ela vai incluir a linha no resultado da consulta. As linhas em que a consulta retorna "false" não são incluídas no resultado.

Por exemplo, um app de e-mails pode ter filtros de spam, lixeira, rascunhos ou outros criados pelo usuário. As instruções abaixo fazem isso com uma cláusula WHERE:

  1. Execute uma instrução SELECT para retornar todas as colunas (*) da tabela email, incluindo uma cláusula WHERE para verificar a condição folder = 'inbox'. Não, isso não é um erro de digitação: você usa um único sinal de igual para conferir a igualdade no SQL e aspas simples em vez de duplas para representar um valor de string.
SELECT * FROM email
WHERE folder = 'inbox';
  1. O resultado retorna apenas linhas para mensagens na caixa de entrada do usuário.

24dd8adef69a3a01.png

Operadores lógicos com cláusulas WHERE

As cláusulas SQL WHERE não se limitam a uma única expressão. Você pode usar a palavra-chave AND, equivalente ao operador e (&&) ao Kotlin, para incluir apenas resultados que atendam às duas condições.

81da61e4e3c52671.png

Como alternativa, você pode usar a palavra-chave OR, equivalente ao operador ou (||) ao Kotlin, para incluir linhas nos resultados que atendam a alguma das condições.

3a3ab0cea06f1949.png

Para facilitar a leitura, você também pode negar uma expressão usando a palavra-chave NOT.

27300a0a38ef0343.png

Muitos apps de e-mail permitem vários filtros, por exemplo, mostrando apenas e-mails não lidos.

Teste as cláusulas WHERE mais complicadas abaixo na tabela email:

  1. Além de retornar apenas mensagens na caixa de entrada do usuário, tente também limitar os resultados a mensagens não lidas. Nesse caso, o valor da coluna de leitura é "false".
SELECT * FROM email
WHERE folder = 'inbox' AND read = false;
  1. Depois de executar a consulta, os resultados terão apenas e-mails não lidos na caixa de entrada do usuário.

14e1e74c282d7939.png

  1. Retorne todos os e-mails que estão na pasta important OR (ou) com estrela (starred = true). Isso significa que o resultado inclui e-mails em pastas diferentes, desde que eles tenham estrela.
SELECT * FROM email
WHERE folder = 'important' OR starred = true;
  1. Observe o resultado.

733c8450f35bf71.png

Pesquisar texto usando LIKE

Uma coisa muito útil a fazer com uma cláusula WHERE é pesquisar texto em uma coluna específica. Para alcançar esse resultado, especifique um nome de coluna, seguido pela palavra-chave LIKE e por uma string de pesquisa.

6692c0d491b6f9af.png

A string de pesquisa começa com o símbolo de porcentagem (%), seguido pelo texto a ser pesquisado (termo de pesquisa) e pelo símbolo de porcentagem (%) novamente.

c69c15f654645ee2.png

Se você estiver pesquisando um prefixo, com resultados que começam com o texto especificado, omita o primeiro símbolo de porcentagem (%).

fbe6a94daaf173ae.png

Como alternativa, se você estiver procurando um sufixo, omita o último símbolo de porcentagem (%).

141f567c9cbc4029.png

Existem muitos casos de uso em que um app pode usar a pesquisa de texto, como pesquisar e-mails que contenham um texto específico na linha de assunto ou atualizar sugestões de preenchimento automático enquanto o usuário digita.

Com as instruções abaixo, você vai poder usar a pesquisa de texto ao consultar a tabela de email.

  1. Os personagens de Shakespeare, como aqueles do nosso banco de dados, adoravam falar sobre tolos (fool, em inglês). Execute a consulta a seguir para conferir o número total de e-mails com o texto "fool" na linha de assunto.
SELECT COUNT(*) FROM email
WHERE subject LIKE '%fool%';
  1. Observe o resultado.

22ebd3ef0876f552.png

  1. Execute a consulta abaixo para retornar todas as colunas de todas as linhas em que o assunto termina com a palavra "fool".
SELECT * FROM email
WHERE subject LIKE '%fool';
  1. Observe que duas linhas são retornadas.

709561928f955053.png

  1. Execute a consulta abaixo para retornar valores distintos da coluna sender que começam com a letra h.
SELECT DISTINCT sender FROM email
WHERE sender LIKE 'h%';
  1. A consulta retorna três valores: helena@example.com, hyppolytus@example.com e hermia@example.com.

7b21887c665288a3.png

7. Agrupar, ordenar e limitar os resultados

Agrupar resultados com GROUP BY

Você acabou de aprender a usar funções de agregação e a cláusula WHERE para filtrar e reduzir resultados. O SQL oferece várias outras cláusulas que podem ajudar a formatar os resultados da consulta. Entre essas cláusulas estão o agrupamento, a ordenação e a limitação de resultados.

É possível usar uma cláusula GROUP BY para agrupar os resultados. Assim, todas as linhas com o mesmo valor de uma determinada coluna são agrupadas entre si nos resultados. Essa cláusula não muda os resultados, apenas a ordem em que são retornadas.

Para adicionar uma cláusula GROUP BY a uma instrução SELECT, inclua a palavra-chave GROUP BY seguida pelo nome da coluna que você quer usar para agrupar os resultados.

6be095e981498bbf.png

Um caso de uso comum é unir uma cláusula GROUP BY com uma função agregada para particionar o resultado de uma função em diferentes buckets, como valores de uma coluna. Confira um exemplo. Imagine que você quer saber o número de e-mails em cada pasta: 'inbox', 'spam' etc. É possível selecionar a coluna folder e a função agregada COUNT() e especificar a coluna folder na cláusula GROUP BY.

  1. Execute a consulta abaixo para selecionar a coluna de pasta e o resultado da função agregada COUNT(). Use uma cláusula GROUP BY para agrupar os resultados pelo valor na coluna folder.
SELECT folder, COUNT(*) FROM email
GROUP BY folder;
  1. Observe os resultados. A consulta retorna o número total de e-mails para cada pasta.

9971ecbdcaf4d3c1.png

Classificar resultados com ORDER BY

Também é possível alterar a ordem dos resultados da consulta ao classificá-los com a cláusula ORDER BY. Adicione a palavra-chave ORDER BY, seguida por um nome de coluna e pela direção de classificação.

9cf561c6346ed6e0.png

Por padrão, a direção de classificação é em a ordem crescente, que pode ser omitida da cláusula ORDER BY. Se você quiser classificar os resultados em ordem decrescente, adicione DESC após o nome da coluna.

É provável que um app de e-mails mostre os e-mails mais recentes primeiro. As instruções abaixo permitem fazer isso com uma cláusula ORDER BY.

  1. Adicione uma cláusula ORDER BY para classificar e-mails não lidos com base na coluna received. Como a ordem crescente (mais antiga ou mais antiga primeiro) é o padrão, é necessário usar a palavra-chave DESC.
SELECT * FROM email
ORDER BY received DESC;
  1. Observe o resultado.

d5149fcf49b32034.png

É possível usar uma cláusula ORDER BY com uma cláusula WHERE. Digamos que um usuário queira pesquisar e-mails antigos que tenham o texto fool. Ele pode classificar os resultados para mostrar primeiro os e-mails mais antigos, em ordem crescente.

  1. Selecione todos os e-mails em que o assunto contém o texto "fool" e classifique os resultados em ordem crescente. Como a ordem é crescente, que é a ordem padrão quando nenhuma é especificada, usar a palavra-chave ASC com a cláusula ORDER BY é opcional.
SELECT * FROM email
WHERE subject LIKE '%fool%'
ORDER BY received ASC;
  1. Observe que os resultados filtrados são retornados com o valor mais antigo (o mais baixo da coluna recebida) em primeiro lugar.

b37f2910a587ffa1.png

Restringir o número de resultados com LIMIT

Até agora, todos os exemplos retornam todos os resultados do banco de dados que correspondem à consulta. Em muitos casos, você só precisa mostrar um número limitado de linhas do banco de dados. É possível adicionar uma cláusula LIMIT à consulta para retornar somente um número específico de resultados. Adicione a palavra-chave LIMIT, seguida do número máximo de linhas que você quer retornar. Se aplicável, a cláusula LIMIT vem depois da cláusula ORDER BY.

122152adf15a9fca.png

Também é possível incluir a palavra-chave OFFSET seguida por outro valor para que o número de linhas seja "ignorado". Por exemplo, se você quiser mostrar os próximos 10 resultados, depois dos 10 primeiros, mas não quiser retornar 20 resultados, use LIMIT 10 OFFSET 10.

37ad836862573d55.png

Em um app, talvez você queira carregar os e-mails mais rapidamente retornando apenas os dez primeiros e-mails na caixa de entrada do usuário. Os usuários podem rolar para encontrar as próximas páginas de e-mails. As instruções abaixo usam uma cláusula LIMIT para fazer isso.

  1. Execute a instrução SELECT abaixo para colocar todos os e-mails na caixa de entrada do usuário em ordem decrescente e limitados aos dez primeiros resultados.
SELECT * FROM email
WHERE folder = 'inbox'
ORDER BY received DESC
LIMIT 10;
  1. Observe que apenas dez resultados são retornados.

61a7c38c0c7d545c.png

  1. Modifique e execute novamente a consulta para incluir a palavra-chave OFFSET com o valor 10.
SELECT * FROM email
WHERE folder = 'inbox'
ORDER BY received DESC
LIMIT 10 OFFSET 10;
  1. A consulta retorna dez resultados em ordem decrescente. No entanto, a consulta pula o primeiro conjunto de dez resultados.

7d1d31276ad8cfeb.png

8. Inserir, atualizar e excluir dados em um banco de dados

Inserir dados em um banco de dados

Além de ler em um banco de dados, há diferentes instruções SQL para gravar em um banco de dados. Os dados precisam ser armazenados de alguma forma.

É possível adicionar uma nova linha a um banco de dados com uma instrução INSERT. Uma instrução INSERT começa com INSERT INTO, seguida pelo nome da tabela em que você quer inserir uma nova linha. A palavra-chave VALUES aparece em uma nova linha seguida de um conjunto de parênteses com uma lista de valores separados por vírgulas. Você precisa listar os valores na mesma ordem das colunas do banco de dados.

33563f4ed898959a.png

Imagine que o usuário recebe um novo e-mail, e precisamos armazená-lo no banco de dados do app. É possível usar uma instrução INSERT para adicionar uma nova linha à tabela email.

  1. Execute uma instrução INSERT com os dados abaixo para um novo e-mail. Como o e-mail é novo, ele não foi lido e aparece inicialmente na pasta folder da caixa de entrada. Um valor de NULL é fornecido para a coluna id, o que significa que id será gerado automaticamente com o próximo número inteiro autoincrementado disponível.
INSERT INTO email
VALUES (
    NULL, 'Lorem ipsum dolor sit amet', 'sender@example.com', 'inbox', false, false, CURRENT_TIMESTAMP
);
  1. O resultado é inserido no banco de dados com um id de 44.
SELECT * FROM email
WHERE sender = 'sender@example.com';

98eda3e5822acc52.png

Atualizar dados existentes em um banco de dados

Depois de inserir dados em uma tabela, ainda é possível fazer mudanças. É possível atualizar o valor de uma ou mais colunas usando uma instrução UPDATE. Uma instrução UPDATE começa com a palavra-chave UPDATE, seguida pelo nome da tabela e uma cláusula SET.

15a2c309405c1442.png

Uma cláusula SET consiste na palavra-chave SET, seguida pelo nome da coluna que você quer atualizar.

bc255ece789859f.png

Em geral, uma instrução UPDATE inclui uma cláusula WHERE para especificar uma ou várias linhas que você quer atualizar com o par de valores de colunas especificado.

b861ca0e8cdbdf37.png

Se o usuário quiser marcar um e-mail como lido, por exemplo, use uma instrução UPDATE para atualizar o banco de dados. As instruções abaixo permitem marcar o e-mail inserido na etapa anterior como lido.

  1. Execute a instrução UPDATE abaixo para definir a linha com um id de 44, de modo que o valor da coluna read seja true.
UPDATE email
SET read = true
WHERE id = 44;
  1. Execute uma instrução SELECT para essa linha específica para validar o resultado.
SELECT read FROM email
WHERE id = 44;
  1. O valor da coluna de leitura agora é 1 para um valor "true" em vez de 0 para "false".

803d0287d4360947.png

Excluir uma linha de um banco de dados

Por fim, use uma instrução SQL DELETE para excluir uma ou mais linhas de uma tabela. Uma instrução DELETE começa com a palavra-chave DELETE, seguida pela palavra-chave FROM, seguida pelo nome da tabela e por uma cláusula WHERE para especificar quais linhas você quer excluir.

2b11c74c90ba9b60.png

As instruções abaixo usam uma instrução DELETE para excluir a linha inserida anteriormente e a atualizada depois do banco de dados.

  1. Execute a instrução DELETE abaixo para excluir a linha com um id de 44 do banco de dados.
DELETE FROM email
WHERE id = 44;
  1. Valide as mudanças usando uma instrução SELECT.
SELECT * FROM email
WHERE id = 44;
  1. Uma linha com um id de 44 não existe mais.

5cc91726691debfc.png

9. Resumo

Parabéns! Você aprendeu muito! Agora é possível ler dados em um banco de dados usando instruções SELECT, incluindo as cláusulas WHERE, GROUP BY, ORDER BY e LIMIT para filtrar os resultados. Você também aprendeu sobre as funções de agregação usadas com frequência, a palavra-chave DISTINCT para especificar resultados exclusivos e a palavra-chave LIKE para realizar uma pesquisa de texto nos valores de uma coluna. Por fim, você aprendeu a usar as linhas INSERT, UPDATE e DELETE em uma tabela de dados.

Essas habilidades vão ser convertidas diretamente pelo Room e, com seu conhecimento de SQL, você estará mais preparado para usar a persistência de dados nos próximos apps.

Sintaxe da instrução SELECT:

2db1588943ae3bf5.png

10. Saiba mais

Embora o foco esteja nas noções básicas do SQL e em alguns casos de uso comuns para desenvolvimento para Android, o SQL pode fazer muito mais. Consulte os recursos abaixo como referências extra sobre o que você aprendeu ou para saber mais sobre o assunto.