Você está na página 1de 11

Embutindo um banco de dados SQLite em sua a... https://www.vivaolinux.com.br/artigos/impresso...

EMBUTINDO UM BANCO DE DADOS SQLITE EM SUA APLICAÇÃO C++

Autor: Filipe Niero Felisbino <filipe_rf at yahoo.com.br>


Data: 06/06/2006

INTRODUÇÃO

1 of 11 10/05/2018 22:41
Embutindo um banco de dados SQLite em sua a... https://www.vivaolinux.com.br/artigos/impresso...

O SQLite não chega ser um banco de dados, mas sim uma biblioteca para armazenamento e
recuperação de dados que suporta o ANSI SQL, o que é muito bom porque isso possibilita uma
migração para outro banco de dados em caso de seu sistema ficar gigante.

Não vamos tentar comparar SQLite com Oracle, MySQL, firebird, etc porque não faz sentido. A
idéia por trás do SQLite é ter um banco de dados simples, sem necessidade de configuração, de
fácil manuseio e que possa ser embutido em outras aplicações. E isto ele faz muito bem!

Principais benefícios do SQLite:

Ultra-leve;
Boa performance;
Tamanho do banco de dados virtualmente ilimitado (até 2 terabytes, segundo a
documentação oficial);
Sem necessidade de configuração;
Compatível com ANSI SQL 92;
Fonte disponível sobre licença de domínio público, podendo ser utilizado para qualquer
fim ( inclusive softwares não-GPL );
Fácil integração com sua aplicação C++.

Mais detalhes sobre o SQLite você poderá encontrar no site do projeto:

http://www.sqlite.org (http://www.sqlite.org)

BAIXANDO E INSTALANDO

Baixe os fontes do SQLite do site www.sqlite.org (http://www.sqlite.org).

Descompacte o arquivo com os fontes:

# tar -xvzf sqlite-3.3.4.tar.gz -C /tmp/

Entre no diretório /tmp/sqlite-3.3.4 e digite os comandos:

# ./configure
# make
# make install

Se tudo correu bem, o SQLite já estará instalado em seu Linux. Para verificar se está tudo OK,
digite o comando:

2 of 11 10/05/2018 22:41
Embutindo um banco de dados SQLite em sua a... https://www.vivaolinux.com.br/artigos/impresso...

# sqlite3 --help

Se aparecer uma listagem com os comandos, seu SQLite está instalado.

NOSSO EXEMPLO

Para este artigo, escrevi um pequeno programa que pode exemplificar bem o uso do SQLite.

O programa é bem simplório, afinal o foco é a gravação e leitura dos dados. O que este programa
faz é simplesmente abrir o banco de dados, gravar 2 clientes, ler os clientes de volta e fechar o
banco de dados.

As funções da API do SQLite que utilizaremos são:

sqlite3_open(): Abre o banco de dados retornando 0 (zero) se o banco foi aberto com
sucesso;
sqlite3_exec(): Executa um comando SQL;
sqlite3_errmsg(): Retorna a mensagem do último erro que aconteceu;
sqlite3_close(): Fecha o banco de dados.

Comandos não usados que também poderão ser úteis:

sqlite3_prepare(): Prepara um statement para execução;


sqlite3_bind_xxx(): onde xxx é um tipo de dados, associa um valor à um parâmetro;
sqlite3_step(): executa um statement previamente preparado;
sqlite3_reset(): volta o statement para seu estado original, sendo que o mesmo pode ser
executado novamente;
sqlite3_clear_bindings(): zera (NULL) todos os parâmetros associados ao statement;
sqlite3_finalize(): deleta um prepared statement.

Bom, mais detalhes sobre a API do SQLite podem ser encontrados em:

http://www.sqlite.org/capi3ref.html (http://www.sqlite.org/capi3ref.html)

CRIANDO A CLASSE CLIENTE

3 of 11 10/05/2018 22:41
Embutindo um banco de dados SQLite em sua a... https://www.vivaolinux.com.br/artigos/impresso...

Apenas para variar um pouco, vamos criar uma classe "Cliente" que será persistida. Para que o
exemplo não ficasse muito extenso, coloquei apenas 2 atributos nesta classe: nome e idade.

Segue a classe Cliente:

# vim Cliente.h

4 of 11 10/05/2018 22:41
Embutindo um banco de dados SQLite em sua a... https://www.vivaolinux.com.br/artigos/impresso...

#ifndef CLIENTE_H_
#define CLIENTE_H_

#include <string>

using namespace std;

class Cliente
{
public:
Cliente();
virtual ~Cliente();

string &getNome() { return this->nome; };


void setNome(string n) { this->nome = n; };

int getIdade() { return this->idade; };


void setIdade(int i) { this->idade = i; };
private:
string nome;
int idade;
};

#endif /*CLIENTE_H_*/

///////////////////////////////////////////
///////Arquivo Cliente.cpp.... não contém nada, afinal é só um exemplo ;)
///////////////////////////////////////////
#include "Cliente.h"

Cliente::Cliente()
{
}

Cliente::~Cliente()
{
}

CLASSE DE BANCO DE DADOS

5 of 11 10/05/2018 22:41
Embutindo um banco de dados SQLite em sua a... https://www.vivaolinux.com.br/artigos/impresso...

É aqui que a magia acontece, a classe "Database" será encarregada de:

Abrir o banco de dados;


Fazer consultas, inserções, alterações, etc;
Fechar o banco de dados.

Segue o header da classe Database:

6 of 11 10/05/2018 22:41
Embutindo um banco de dados SQLite em sua a... https://www.vivaolinux.com.br/artigos/impresso...

#ifndef DATABASE_H_
#define DATABASE_H_

#include <string.h>
#include <vector>
#include <sqlite3.h>

using namespace std;

#include "Cliente.h"

class Database
{
public:
Database();
virtual ~Database();

int insereCliente(Cliente *c);


vector<Cliente*> listaClientes();
private:
sqlite3 *db;

};

static int listaCliCallback(void *v, int argc, char **argv, char **colNames);

#endif /*DATABASE_H_*/

//////////////////////////////
//// Database.cpp
//// Faz o gerenciamento do banco de dados
///////////////////////////////

#include <sqlite3.h>
#include <vector>

#include "Database.h"
#include "Cliente.h"

using namespace std;

7 of 11 10/05/2018 22:41
Embutindo um banco de dados SQLite em sua a... https://www.vivaolinux.com.br/artigos/impresso...

Database::Database() {
int result = sqlite3_open("/tmp/vivaolinux.db", &db);
if (result) {
printf("Não foi possível abrir o banco de dados. Erro:%s ", sqlite3_errmsg(db));
sqlite3_close(db);
}

char *erro=NULL;
sqlite3_exec(db, "CREATE TABLE CLIENTE (NOME VARCHAR(50), IDADE INT);", NULL,
NULL, &erro);
if (erro!=NULL) {
// se a tabela já existe pode acontecer erro... ignorar
// printf(stderr, "Não foi possível criar");
delete erro;
}
}

Database::~Database() {
sqlite3_close(db);
}

int Database::insereCliente(Cliente *c) {


char sql[50];
sprintf(sql, "INSERT INTO CLIENTE (NOME, IDADE) VALUES ('%s', %d)",
c->getNome().c_str(), c->getIdade() );
char *erro=NULL;
int result = sqlite3_exec(db, sql, NULL, NULL, &erro);
if (erro!=NULL) {
printf("Problema ao inserir o registro no banco de dados. Mensagem de erro: %s ", erro);
}
return result;
}

vector<Cliente*> Database::listaClientes() {
vector<Cliente*> result;
char *erro=NULL;
sqlite3_exec(db, "SELECT * FROM CLIENTE", listaCliCallback, &result, &erro);
return result;
}

8 of 11 10/05/2018 22:41
Embutindo um banco de dados SQLite em sua a... https://www.vivaolinux.com.br/artigos/impresso...

static int listaCliCallback(void *v, int argc, char **argv, char **colNames) {
vector<Cliente*>* result = (vector<Cliente*>*) v;
Cliente *c = new Cliente();
c->setNome(argv[0]);
c->setIdade(atoi(argv[1]));
result->push_back(c);
return 0;
}

COMPILANDO TUDO

9 of 11 10/05/2018 22:41
Embutindo um banco de dados SQLite em sua a... https://www.vivaolinux.com.br/artigos/impresso...

A compilação fica normal, o único detalhe é que você precisará passar um parâmetro a mais para
o linker encontrar os símbolos contidos na biblioteca do SQLite e juntar tudo no seu programa. Da
forma que coloquei, a SQLite fica dentro do seu programa, ou seja, você não precisa distribuir a
library junto.

$ g++ -O0 -g3 -Wall -c -fmessage-length=0 -oCliente.o ../Cliente.cpp


$ g++ -O0 -g3 -Wall -c -fmessage-length=0 -oDatabase.o ../Database.cpp
$ g++ -O0 -g3 -Wall -c -fmessage-length=0 -omain.o ../main.cpp

$ g++ -oexemplovol ./Cliente.o ./Database.o ./main.o /tmp/sqlite-3.3.4/.libs/libsqlite3.a

Após a compilação execute o binário algumas vezes, você vai notar que à cada execução a
listagem retornará 2 clientes à mais.

Para quem não acredita que é tão simples fazer isto, segue a forma de testar se tudo correu bem.

Abra um terminal, e digite:

$ sqlite3 /tmp/vivaolinux.db

Você receberá uma mensagem com a versão do seu SQLite e um prompt para digitar um
comando. Digite:

select * from cliente;

Pronto, o SQLite mostrará o conteúdo desta tabela.

CONCLUSÃO

10 of 11 10/05/2018 22:41
Embutindo um banco de dados SQLite em sua a... https://www.vivaolinux.com.br/artigos/impresso...

Bom pessoal, espero realmente que o artigo sirva para alguma coisa. Se faltou algum detalhe,
por favor me comuniquem.

Um detalhe importante à ressaltar, é que o SQLite vem sendo suportado por uma grande gama
de linguagens de programação como: C, C++, Java, Delphi, Free Pascal, PHP, etc. Isto realmente
é bom porque aumenta bastante a interoperabilidade dos dados de determinado aplicativo.

Como eu falei, porém, não devemos confundir as coisas, apesar de utilizarmos a palavra 'Banco
de Dados' o SQLite está longe de ser isso, ele é simplesmente uma ferramenta para persistir
dados. Ele tem utilidade em uma gama muito grande de aplicações, porém não pense em criar
um ERP gigante em cima dele ;)

Mais informações podem ser encontradas no site de projeto:

http://www.sqlite.org (http://www.sqlite.org)

 Voltar (verArtigo.php?codigo=4741)

11 of 11 10/05/2018 22:41

Você também pode gostar