Este tutorial é o segundo de uma série em programação SQLite em C.
SQLite armazena uma coleção de tabelas em um único arquivo base de dados, geralmente terminando em .db. Cada tabela é como uma planilha, consiste em várias colunas e cada linha tem valores.
Se ajudar, pense em cada linha como sendo uma struct, com o colunas na tabela correspondente aos campos na estrutura.
Uma tabela pode ter quantas linhas caberem em um disco. Há um limite superior, mas seus enormes 18.446.744.073.709.551.616 são precisos.
Uma tabela pode ter até 2.000 colunas ou, se você recompilar a fonte, você pode maximizar para incríveis 32.767 colunas.
A API SQLite
Para usar o SQLite, precisamos fazer chamadas para a API. Você pode encontrar uma introdução a esta API no site oficial Introdução à interface SQLite C / C ++ página da web. É uma coleção de funções e fácil de usar.
Primeiro, precisamos de um identificador para o banco de dados. Esse é do tipo sqlite3 e é retornado por uma chamada para sqlite3_open (nome do arquivo, ** ppDB). Depois disso, executamos o SQL.
Vamos primeiro fazer uma pequena digressão e criar um banco de dados utilizável e algumas tabelas usando o SQLiteSpy. (Consulte o tutorial anterior para obter links para isso e o Navegador de banco de dados SQLite).
Eventos e Espaços
O banco de dados sobre. O DB manterá três tabelas para gerenciar eventos em vários locais. Esses eventos serão festas, discotecas e shows e ocorrerão em cinco locais (alfa, beta, charlie, delta e eco). Quando você está modelando algo assim, geralmente ajuda começar com uma planilha. Por uma questão de simplicidade, armazenarei uma data e não uma hora.
A planilha possui três colunas: Datas, Local, Tipo de Evento e cerca de dez eventos como este. As datas vão de 21 a 30 de junho de 2013.
Agora, o SQLite não tem um tipo de data explícito, portanto, é mais fácil e rápido armazená-lo como int e da mesma maneira que o Excel usa datas (dias desde 1º de janeiro de 1900) têm valores int de 41446 a 41455. Se você colocar as datas em uma planilha e formatar a coluna da data como um número com 0 casas decimais, será algo como isto:
Agora, podemos armazenar esses dados em uma tabela e, para um exemplo tão simples, provavelmente seria aceitável. No entanto, boas práticas de design de banco de dados requerem alguma normalização.
Itens de dados exclusivos, como o tipo de local, devem estar em sua própria tabela e os tipos de eventos (festa etc.) também devem estar em uma. Finalmente, como podemos ter vários tipos de eventos em vários locais (um relacionamento de muitos para muitos), precisamos de uma terceira tabela para armazená-los.
As três tabelas são:
- locais - mantém todos os cinco locais
- eventtypes - mantém todos os três tipos de eventos
- events - mantém a data mais o ID do local e o ID do tipo de evento. Também adicionei um campo de descrição para este evento, por exemplo, "Aniversário de Jim".
As duas primeiras tabelas mantêm os tipos de dados para que os locais tenham nomes alfa para eco. Também adicionei um ID inteiro e criei um índice para isso. Com o pequeno número de locais (5) e tipos de eventos (3), isso pode ser feito sem um índice, mas com tabelas maiores, fica muito lento. Portanto, qualquer coluna que possa ser pesquisada adicione um índice, preferencialmente inteiro
O SQL para criar isso é:
O índice na tabela de eventos possui data, ID-evento, tipo de evento e local. Isso significa que podemos consultar a tabela de eventos para "todos os eventos em uma data", "todos os eventos em um local", "todas as partes" etc., e combinações daquelas como "todas as partes em um local" etc.
Após executar o SQL, criar consultas de tabela, as três tabelas são criadas. Observe que coloquei todo esse sql no arquivo de texto create.sql e ele inclui dados para preencher algumas das três tabelas.
Se você colocar; no final das linhas, como fiz no create.sql, você pode executar em lote e executar todos os comandos de uma só vez. Sem o; você tem que executar cada um por si. No SQLiteSpy, basta clicar em F9 para executar tudo.
Também incluí o sql para soltar todas as três tabelas nos comentários de várias linhas usando / *.. * / mesmo que em C. Basta selecionar as três linhas e pressionar Ctrl + F9 para executar o texto selecionado.
Esses comandos inserem os cinco locais:
Novamente, incluí texto comentado em tabelas vazias, com o excluir de linhas Não há como desfazer, portanto, tenha cuidado com estes!
Surpreendentemente, com todos os dados carregados (reconhecidamente não muito), o arquivo de banco de dados inteiro no disco é de apenas 7 KB.
Dados do Evento
Em vez de criar um monte de dez instruções de inserção, usei o Excel para criar um arquivo .csv para os dados do evento e, em seguida, usou o utilitário de linha de comando SQLite3 (fornecido com o SQLite) e os seguintes comandos para importar isto.
Nota: Qualquer linha com um prefixo de ponto (.) É um comando. Use .help para visualizar todos os comandos. Para executar o SQL, digite-o sem prefixo de ponto final.
Você precisa usar duas barras negras \\ no caminho de importação para cada pasta. Faça a última linha somente após a importação. Quando o SQLite3 é executado, o separador padrão é a: portanto, ele deve ser alterado para vírgula antes da importação.
Voltar ao Código
Agora temos um banco de dados totalmente preenchido, vamos escrever o Código C para executar esta consulta SQL que retorna uma lista de partes, com descrição, datas e locais.
- Novo no SQL? Leia o que é SQL?
Isso faz uma junção usando a coluna idvenue entre a tabela de eventos e locais, para que obtenhamos o nome do local e não seu valor int idvenue.
Funções da API SQLite C
Existem muitas funções, mas precisamos apenas de um punhado. A ordem do processamento é:
- Abra o banco de dados com sqlite3_open (), saia se houver um erro ao abri-lo.
- Prepare o SQL com sqlite3_prepare ()
- Loop usando slqite3_step () até não haver mais registros
- (No loop) processe cada coluna com sqlite3_column ...
- Por fim, chame sqlite3_close (db)
Há uma etapa opcional depois de chamar sqlite3_prepare onde qualquer parâmetro passado é vinculado, mas guardaremos isso para um tutorial futuro.
Portanto, no programa listado abaixo, o pseudo-código das principais etapas são:
O sql retorna três valores; portanto, se sqlite3.step () == SQLITE_ROW, os valores serão copiados dos tipos de coluna apropriados. Eu usei int e texto. Eu mostro a data como um número, mas fique à vontade para convertê-la em uma data.
Listagem de código de exemplo