Embutindo um banco de dados SQLite em sua aplicação C++

Com o SQLite você pode criar um banco de dados para sua aplicação sem precisar instalar softwares adicionais, nem configurar nada na máquina. Neste artigo espero demonstrar o funcionamento deste banco de dados e a integração dele com sua aplicação C++.

[ Hits: 63.939 ]

Por: Filipe Niero Felisbino em 06/06/2006


Classe de banco de dados



É 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:

#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;

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;
}

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;
}
Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Nosso exemplo
   3. Criando a classe cliente
   4. Classe de banco de dados
   5. Compilando tudo
   6. Conclusão
Outros artigos deste autor

Implementando o Interscan VirusWall com Postfix

Utilizando o Thunderbird no Windows e Linux

Leitura recomendada

Acessando PostgreSQL com C - Cursores

Usando MySQL na linguagem C

Ensaio acerca de bibliotecas de código aberto para abstração de acesso a banco de dados em linguagem C++

Acessando PostgreSQL com C

PostgreSQL - Embutindo comandos SQL no seu código C

  
Comentários
[1] Comentário enviado por Ragen em 06/06/2006 - 14:00h

Legal o artigo.

Existe alguma ferramenta estilo MySQL-Front/Navicat (Gerenciador Visual do Banco) para SQLite?

[2] Comentário enviado por mmaia em 07/06/2006 - 04:16h

Ragen, eu uso mais esses 2, mas tem outros:

Web, estilo PHPMyAdmin
http://sourceforge.net/projects/sqlitemanager/

Desktop (QT)
http://sqlitebrowser.sourceforge.net/

[3] Comentário enviado por clint74 em 03/10/2008 - 15:39h

Muito bom este tutorial, parabéns!

Não o encontrei o arquivo main vc poderia disponibilizá-lo?

[4] Comentário enviado por faustojacome em 19/07/2009 - 20:46h

Não consegui compilar o Database.cpp.

Também não achei o main.cpp.

[5] Comentário enviado por lbrusca em 30/12/2009 - 12:07h

Uma dica para seus próximos artigos: separe dentro do artigo os arquivos de codigo fonte.
Não Consegui encontrar no seu artigo a referencia a main.cpp

[6] Comentário enviado por bitetti em 29/07/2011 - 09:08h

Bom artigo. Fiquei fã desse DB ai esses dias. Quando bem usado é uma poderosa ferramenta.

[7] Comentário enviado por aj.vini em 01/11/2011 - 14:49h

Artigo muito bom! Era exatamente o que eu precisava... e complementando tbm tem wrapper do sqlite pro Python, o nome é pysqlite. Muito bacana! Parabéns!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts