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

quinta-feira, 15 de setembro de 2011

Tutorial wxWidgets e sqlite3 parte 14 - Excluindo registros

Para finalizar o sistema, vamos escrever a função para deletar os registros.

Ela vai funcionar da seguinte maneira:

Vamos criar uma função que vai receber o ID do registro que está sendo editado, vamos passar este ID para um comando SQL, vamos chamar ExecuteUpdate(SQL).

Escreva a função:

sqlf.h
//Função para deletar um registro...
//Passo como parâmetro o ID do registro que será deletado...
void DeleteInDB(wxString ID);

sqlf.cpp
void DeleteInDB(wxString ID)
{
    //Abro o banco de dados
    wxSQLite3Database *db = OpenDB(GetExecPath() + wxT("/agenda.db3"));

    //SQL para deletar o registro...
    wxString SQL = wxT("DELETE FROM contatos WHERE ID=") + ID + wxT(";");

    //ExecuteUpdate para deletar o registro...
    db->ExecuteUpdate(SQL);

    //Fecho db...
    CloseDB(db);
}

Agora vamos chamar esta função no frame principal, na função OnClickDelete.

Nó vamos confirmar com o usuário se ele quer mesmo que delete o registro, depois deletamos o registro.

framep.cpp
//Aqui o evento quando eu clicar no botão deletar...
void wxFramePrincipal::OnClickDeletar(wxCommandEvent& event)
{
    //Vamos verificar também se o registro está em modo de edição...
    //Pois se não estiver, não teremos quem deletar lá no banco de dados...
    if(ID == -1)
        return;

    //Vamos perguntar primeiro se o usuário tem certeza que quer deletar o registro...
    int confirma = wxMessageBox(wxT("Tem certeza que quer deletar o registro?"), wxT("Confirmação"), wxYES_NO);

    //Se o usuário clicar em não, cancelo a função...
    if(confirma == wxNO)
        return;

    //Executo a função para deletar o registro...
    DeleteInDB(wxString::Format(wxT("%d"), ID));

    //Após deletarmos um registro atualizamos o wxGrid lista contatos...
    SelectInDB(lista_contatos);

    //E limpamos os campos de edição...
    LimparCampos();
}

Pronto, o sistema está completo, agora vocês podem refazer o mesmo, adicionando novas funcionalidades, adicionando outros campos, tabelas, etc...

Espero que tenham aproveitado a sequencia de tutoriais sobre wxWidgets e sqlite3 usando a biblioteca wxSqlite3.

Até a próxima.

quarta-feira, 14 de setembro de 2011

Tutorial wxWidgets e sqlite3 parte 13 - Editando valores no banco de dados

A edição de dados vai ser feita com base na função de inserção de dados, para isto criaremos a mesma nos arquivos sqlf.* do projeto.

Como ela irá funcionar:

Nó passaremos como parâmetros, o ID do registro que está sendo editado, para fazermos o controle na cláusula WHERE do SQL, passaremos também o nome que foi editado e a idade.

Antes de executarmos qualquer alteração verificamos se os dados são válidos, se não estão em branco ou se idade é realmente um número.

O comando usado aqui será o ExecuteQuery(), o mesmo usado na inserção dos dados.

Vamos escrever.

No arquivo sqlf.h digite:

sqlf.h
//Aqui a função para editar os dados...
void UpdateDB(wxString ID, wxString nome, wxString idade);

No arquivo sqlf.cpp:

sqlf.cpp
void UpdateDB(wxString ID, wxString nome, wxString idade)
{
    //Primeiro vejo se o nome ou idade estão em branco
    if(nome.IsEmpty() || idade.IsEmpty())
    {
        //Aviso ao usuário que algum dado está em branco:
        wxMessageBox(wxT("Nenhum campo pode estar em branco!"));
        //Cancelo a função...
        return;
    }

    //Agora preciso ver se a idade é um número...
    //Crio um long int
    long int confere_idade;

    //Tento converter a string idade em um número...
    if(!idade.ToLong(&confere_idade))
    {
        //Se não conseguir, significa que ele não é um inteiro...
        //Aviso o usuário...
        wxMessageBox(wxT("O valor da idade (") + idade + wxT(") não é um número"));
        //Cancelo a função...
        return;
    }

    //Se chegamos até aqui, é porque tudo está correto...
    //Vamos abrir o banco de dados:
    wxSQLite3Database *db = OpenDB(GetExecPath() + wxT("/agenda.db3"));

    //Agora vamos montar o sql para editar os dados...
    wxString SQL = wxT("UPDATE contatos \n");
    SQL += wxT("SET NOME = '") + nome + wxT("',\n");
    SQL += wxT("IDADE = ") + idade + wxT("\n");
    SQL += wxT(" WHERE ID = ") + ID + wxT(";");

    //Agora executo a função ExecuteUpdate, que vimos no tutorial inserir, passando como
    //parâmetro a wxString SQL...
    db->ExecuteUpdate(SQL);

    //Fecho db...
    CloseDB(db);
}


Agora vamos chamar a mesma em framep.cpp:

framep.cpp
if(ID == -1)
    {
        //Se a variável ID for = -1, é porque estamos em inserção...
        //E passamos as duas como parâmetros para a função InsertInDB()...
        InsertInDB(get_nome, get_idade);
    }
    else
    {
        //Pegamos o valor do ID...
        wxString get_id = wxString::Format(wxT("%d"), ID);
        //Passamos como parâmetros, para a função...
        UpdateDB(get_id, get_nome, get_idade);
    }


Pequenas alterações que fiz na GUI do sistema.

framep.cpp
//Adicionei um tamanho padrão para a janela...
this->SetSize(wxSize(450, 350));

//Adiciono o box dos botões ao box principal...
//Aqui arrumei o tamanho do sizer dos botões em relação
//a janela e dei um espaço de 10px na base
boxp->Add(box_btns, 0, wxEXPAND|wxBOTTOM, 10);

Estamos quase terminando nosso sistema, falta apenas implementar a função de deletar...

Até a próxima.

Tutorial wxWidgets e sqlite3 parte 12 - Limpando os Campos após alterações e aproveitando para acertar algumas coisas...

Nesta parte do tutorial, iremos implementar a função LimparCampos(), do arquivo framep.cpp.

O que ela irá fazer?

1 – Vai alterar o valor de ID para -1, ou seja, cancelar a edição...
2 – Vai limpar o campo nome.
3 – Vai limpar o campo idade.
4 – Alterar o título da janela para modo de inserção.

O código vai ficar assim:

Digite o seguinte em framep.cpp

framep.cpp
//Esta função eu vou usar para limpar os campos
//como eu precisarei fazer isto sempre que eu completar uma alteração
//vou escrever este código em uma função em separado...
void wxFramePrincipal::LimparCampos()
{
    //A função mais simples de todas...
    //Será usada na criação do frame.
    //Na função OnClickSalvar
    //Na função OnClickLimpar
    //e na função OnClickDeletar

    //Primeiro vamos alterar o valor do ID para -1
    //Para voltarmos ao modo de Inserção...
    ID = -1;

    //Agora limpamos o nome...
    nome->Clear();

    //limpamos o campo idade...
    idade->Clear();

    //Alteramos o valor da janela para modo de Inserção...
    this->SetTitle(wxT("Teste Tutorial Sqlite3 - Modo de Inserção"));
}

Agora vamos chamá-la no final da criação do frame principal:

    boxp->Add(box_btns, 1, wxEXPAND, 0);

    //"Digo" ao meu frame que o boxp é o box principal...
    this->SetSizer(boxp);

    //Aqui apenas faço com que tudo seja arranjado de maneira correta...
    this->Layout();

    //Aqui chamo a função limpar campos...
    LimparCampos();

    //Vamos carregar os dados no grid...
    SelectInDB(lista_contatos);
}

Também no final da função OnClickSalvar

    }

    //Após editarmos um valor, recarregamos os valores no grid...
    SelectInDB(lista_contatos);

    //E também limpamos os valores de edição/inserção...
    LimparCampos();
}

Aproveitamos para implementar a função OnClickLimpar

//Aqui o evento que vai limpar os campos...
void wxFramePrincipal::OnClickLimpar(wxCommandEvent& event)
{
    //Chamamos a função LimparCampos()...
    LimparCampos();
}

E adiantamos algumas coisas na função OnClickDeletar

//Aqui o evento quando eu clicar no botão deletar...
void wxFramePrincipal::OnClickDeletar(wxCommandEvent& event)
{
    //Vamos verificar também se o registro está em modo de edição...
    //Pois se não estiver, não teremos quem deletar lá no banco de dados...
    if(ID == -1)
        return;

    //Após deletarmos um registro atualizamos o wxGrid lista contatos...
    SelectInDB(lista_contatos);

    //E limpamos os campos de edição...
    LimparCampos();
}


Vejam que tínhamos uma função chamada ConfereCampos em framep.h e framep.cpp, por descuido, acabei implementando isto na função de inserir registros de sqlf.cpp, para não enrolarmos a continuidade do tutorial, deletem esta função ConfereCampos dos dois arquivos, o *.h e o *.cpp.

Mais uma parte do tutorial concluída, no próximo iremos finalizar o código do tutorial.

Até a próxima.

Tutorial wxWidgets e sqlite3 parte 11 - Passando os dados do wxGrid para a edição

Hoje vamos escrever a função do duplo click no wxGrid.

O objetivo desta função é:

Ao clicar duas vezes em alguma célula do wxGrid lista_contatos, pegaremos a linha que foi clicada, depois passaremos os valores do ID, NOME e IDADE para seus respectivos valores de edição que são:

A variável ID que vai controlar se estamos em modo de edição ou não, se for em modo de edição qual registro que está sendo editado.

A caixa de texto nome.

A caixa de texto idade.

Vamos ao código:

Em framep.cpp, altere a seguinte parte:

framep.cpp
//Aqui o evento que será executado
//quando eu der 2 cliques em uma célula...
void wxFramePrincipal::OnDoubleClickCell(wxGridEvent& event)
{
    //Primeiro vamos pegar o índice da linha que está sendo clicada:
    int row = event.GetRow();

    //Agora vamos passar os valores desta linha para nossos dados...

    //Primeiro a variável ID
    long int get_id;
    lista_contatos->GetCellValue(row, 0).ToLong(&get_id);

    ID = get_id;
    //Veja que neste momento, a varável ID assume um valor maior que -1
    //Então entramos no modo de edição...

    //Agora pego o valor atual para nome...
    nome->SetValue(lista_contatos->GetCellValue(row, 1));

    //E por último a idade...
    idade->SetValue(lista_contatos->GetCellValue(row, 2));

    //Agora podemos fazer as alterações dos valores, passando como parâmetro
    //o valor do ID...

    //Uma alteração que podemos fazer também é
    //colocar um aviso no título da janela
    //para dizer ao usuário qual a função que ele está executando:

    this->SetTitle(wxT("Teste Tutorial Sqlite3 - Modo de Edição"));
}

Pronto, agora o usuário poderá selecionar qual registro ele quer editar.

No próximo tutorial, implementar a função que limpa os campos após as edições.

Até a próxima.

sexta-feira, 9 de setembro de 2011

Tutorial wxWidgets e sqlite3 parte 9 - Inserindo valores no banco de dados


Hoje vamos ver como inserir valores no banco de dados.

Primeiro, devemos entender como o processo de inserção será feito pelo programa:

Existem dois campos do tipo wxTextCtrl no wxFrame que controla a aplicação, nós pegaremos os valores dessas caixas de texto, veremos primeiro se o nome está em branco e se a idade realmente é um número, se as duas afirmações forem verdadeiras executamos a função que insere os valores no banco de dados, se não, cancelamos a função e avisamos o usuário que os dados estão incompletos ou errados.

Mas vamos lembrar uma coisa, quando clicamos no botão salvar, podemos ter uma ação de inserção ou de edição, para isto, temos a variável de controle chamada ID, que criamos no frame principal, veja que ela inicia com o valor -1, então, sempre que tivermos este valor, a ação será de inserção.

Vamos lembrar como ficaria o código SQL para inserirmos um valor na nossa tabela contatos:

INSERT INTO contatos(ID, NOME, IDADE) VALUES(NULL, 'NOME DO CONTATO', 1);

Vejam que uso apóstrofo entre valores do tipo VARCHAR, e passamos o ID que é chave primária como NULL.

O nome do contato, será o valor que foi digitado na caixa de texto Nome e sua idade será o valor que está na caixa de texto Idade.

Para fazer esta inserção vamos criar uma função que vai pegar estes dois valores e verificar se estão corretos e fazer a inserção, ficará assim:

Em sqlf.h digite:

sqlf.h
//Aqui escrevo uma função que vai receber o nome e a idade como parametros...
void InsertInDB(wxString nome, wxString idade);

Agora vamos implementá-la em sqlf.cpp, digite:

sqlf.cpp
//Vamos Implementá-la
void InsertInDB(wxString nome, wxString idade)
{
    //Primeiro vejo se o nome ou idade estão em branco
    if(nome.IsEmpty() || idade.IsEmpty())
    {
        //Aviso ao usuário que algum dado está em branco:
        wxMessageBox(wxT("Nenhum campo pode estar em branco!"));
        //Cancelo a função...
        return;
    }

    //Agora preciso ver se a idade é um número...
    //Crio um long int
    long int confere_idade;

    //Tento converter a string idade em um número...
    if(!idade.ToLong(&confere_idade))
    {
        //Se não conseguir, significa que ele não é um inteiro...
        //Aviso o usuário...
        wxMessageBox(wxT("O valor da idade (") + idade + wxT(") não é um número"));
        //Cancelo a função...
        return;
    }

    //Se chegamos até aqui, é porque tudo está correto...
    //Vamos abrir o banco de dados:
    wxSQLite3Database *db = OpenDB(GetExecPath() + wxT("/agenda.db3"));

    //Agora vamos montar o sql para inserir os dados...
    wxString SQL = wxT("INSERT INTO contatos(ID, NOME, IDADE) VALUES(NULL, '");
    SQL += nome + wxT("', ");
    SQL += idade + wxT(");");

    //Reparem que adiciono os apóstrofos apenas nos campos VARCHAR...
    //Tenham muito cuidado quando montarem comandos SQL, para não adicionarem
    //valores incorretos, como virgulas após o ultimo campo
    //esquecerem-se de fechar parenteses, etc...

    //uma maneira simples é fazer o seguinte...
    //Escreva o comando todo SQL...

    //wxString SQL = wxT("INSERT INTO contatos(ID, NOME, IDADE) VALUES (NULL, 'NOME', IDADE);");

    //Agora adicione as variáveis no lugar dos valores com os sinais de concatenação:

    //wxString SQL = wxT("INSERT INTO contatos(ID, NOME, IDADE) VALUES (NULL, ' + nome + ', + idade + );");

    //Antes de cada + à esquerda da variável adicione ") e depois de cada + à direita da variável adicione wxT("

    //wxString SQL = wxT("INSERT INTO contatos(ID, NOME, IDADE) VALUES (NULL, '") + nome + wxT("',") + idade + (");");

    //Agora executo a função ExecuteUpdate, que vimos no tutorial anterior, passando como
    //parâmetro a wxString SQL...
    db->ExecuteUpdate(SQL);

    //Fecho db...
    CloseDB(db);
}

E pra finalizarmos, vamos chamar esta função no evento OnClickSalvar() do frame principal:

Veja que já adicionei a estrutura condicional para sabermos se está em edição ou inserção:

Em framep.cpp digite:

framep.cpp
//Aqui eu inicio a implementação do evento para salvar ou editar um registro...
void wxFramePrincipal::OnClickSalvar(wxCommandEvent& event)
{
    //Vamos, primeiro, verificar qual operação será feita
    //Inserção ou Edição
    if(ID == -1)
    {
        //Se a variável ID for = -1, é porque estamos em inserção...
        //Vamos pegar os valores do campo nome...
        wxString get_nome = nome->GetValue();
        //...agora pegamos a idade...
        wxString get_idade = idade->GetValue();

        //E passamos as duas como parâmetros para a função InsertInDB()...
        InsertInDB(get_nome, get_idade);
    }
    else
    {
    }
}

Vamos testar a função, abrindo o terminal ou o prompt de comando do Windows:

Abra o banco de dados com o comando:
> sqlite3 caminho/para/o/banco_de_dados/agenda.db3


Agora abra o sistema e adicione alguns valores, veja que após inserirmos os valores, os campos continuam preenchidos, iremos alterar isto nos próximos tutoriais.


Agora volte para o terminal e faça uma seleção na tabela contatos:

>SELECT * FROM contatos;


Vejam que os registros já estão lá.


Dúvidas, deixem nos comentários.

Os arquivos alterados completos:

sqlf.h
//ARQUIVO DO BLOG - http://wxnewbie.blogspot.com
//TUTORIAL wxWidgets + sqlite3 usando wxSqlite3

#ifndef SQLF_H_INCLUDED
#define SQLF_H_INCLUDED

#include <wx/wx.h>
#include <wx/wxsqlite3.h>
#include <wx/stdpaths.h>

wxString GetExecPath();
//Nesta primeira função, iremos abrir um banco de dados indicado pelo
//parâmetro caminho e retornar um ponteiro para wxSQLite3Database...
//Se o banco de dados não existir, será criado um...
wxSQLite3Database *OpenDB(wxString caminho);
//Aqui iremos apenas fechar o mesmo...
//Isto é necessário, pois liberaremos o arquivo para novos acessos...
void CloseDB(wxSQLite3Database* db);

//Esta função será usada para criar o nosso banco de dados
//e também para criar a tabela contatos.
//Ela será executada apenas uma vez...
void CreateDBAgenda();

//Aqui escrevo uma função que vai receber o nome e a idade como parametros...
void InsertInDB(wxString nome, wxString idade);

#endif // SQLF_H_INCLUDED


sqlf.cpp
//ARQUIVO DO BLOG - http://wxnewbie.blogspot.com
//TUTORIAL wxWidgets + sqlite3 usando wxSqlite3

#include "sqlf.h"

//Função para pegar o diretório da aplicação, já explicada no blog...
wxString GetExecPath()
{
 wxString retorno;
 retorno = wxStandardPaths::Get().GetExecutablePath();
 retorno = wxPathOnly(retorno);
 return retorno;
}

//Vamos implementar nossa função OpenDB...
wxSQLite3Database *OpenDB(wxString caminho)
{
    //Aqui eu crio um ponteiro para um wxSQLite3Database chamado db...
    //É ele que nós retornaremos na função...
    wxSQLite3Database *db = new wxSQLite3Database();

    //Aqui uso a função Open, passando como parâmetro o caminho para o banco de dados...
    //O interessante aqui é vermos que se existir um banco de dados neste lugar a função
    //irá abrir o mesmo, se não existir o banco de dados será criado...
    db->Open(caminho);

    //Vocês poderão ter um problema ao executar esta função, dizendo que Open possui mais de
    //um parâmetro, se isto acontecer, basta usá-la desta maneira:

    //db->Open(caminho, wxEmptyString);

    //O segundo parametro seria a senha para o banco de dados,
    //se estivessemos usando criptografia no mesmo...

    //retornamos o db...
    return db;
}

//Aqui vamos fechar a "conexão" com o banco de dados...
void CloseDB(wxSQLite3Database* db)
{
    //Vemos se db é verdadeiro...
    assert(db != NULL);
    //Fechamos db com o comando Close();
    db->Close();

    //Deletamos db da memória...
    delete db;
}

void CreateDBAgenda()
{
    //Primeiro, vamos pegar o diretório da aplicação mais o nome do banco de dados...
    wxString conf_path = GetExecPath() + wxT("/agenda.db3");

    //Agora vamos verificar se o arquivo já existe...
    //Se existir, paro a execução da função...
    if(wxFileExists(conf_path))
    {
        return;
    }

    //Se ele não existir crio um wxSQLite3Database com este caminho...
    wxSQLite3Database *db = OpenDB(conf_path);

    //Ok, agora criamos um sql com o comando de criação da nossa tabela
    //CREATE TABLE contatos(
    //ID INTEGER PRIMARY KEY,
    //NOME VARCHAR(50),
    //IDADE INTEGER
    //);

    //Vamos adicionar isto em uma wxString

    wxString SQL = wxT("CREATE TABLE contatos(\n");
    SQL += wxT("ID INTEGER PRIMARY KEY,\n");
    SQL += wxT("NOME VARCHAR(50),\n");
    SQL += wxT("IDADE INTEGER\n");
    SQL += wxT(");");

    //Agora vamos usar ExecuteUpdate para executar este SQL...
    //Usamos ExecuteUpdate para criarmos tabelas, views, triggers...
    //Inserir registros no banco de dados...
    //Editar registros no banco de dados...
    //Excluir registros no banco de dados...
    //Não use ExecuteUpdate para seleções...
    db->ExecuteUpdate(SQL);

    //Fechamos a conexão com o banco de dados...
    CloseDB(db);
}

//Vamos Implementá-la
void InsertInDB(wxString nome, wxString idade)
{
    //Primeiro vejo se o nome ou idade estão em branco
    if(nome.IsEmpty() || idade.IsEmpty())
    {
        //Aviso ao usuário que algum dado está em branco:
        wxMessageBox(wxT("Nenhum campo pode estar em branco!"));
        //Cancelo a função...
        return;
    }

    //Agora preciso ver se a idade é um número...
    //Crio um long int
    long int confere_idade;

    //Tento converter a string idade em um número...
    if(!idade.ToLong(&confere_idade))
    {
        //Se não conseguir, significa que ele não é um inteiro...
        //Aviso o usuário...
        wxMessageBox(wxT("O valor da idade (") + idade + wxT(") não é um número"));
        //Cancelo a função...
        return;
    }

    //Se chegamos até aqui, é porque tudo está correto...
    //Vamos abrir o banco de dados:
    wxSQLite3Database *db = OpenDB(GetExecPath() + wxT("/agenda.db3"));

    //Agora vamos montar o sql para inserir os dados...
    wxString SQL = wxT("INSERT INTO contatos(ID, NOME, IDADE) VALUES(NULL, '");
    SQL += nome + wxT("', ");
    SQL += idade + wxT(");");

    //Reparem que adiciono os apóstrofos apenas nos campos VARCHAR...
    //Tenham muito cuidado quando montarem comandos SQL, para não adicionarem
    //valores incorretos, como virgulas após o ultimo campo
    //esquecerem-se de fechar parenteses, etc...

    //uma maneira simples é fazer o seguinte...
    //Escreva o comando todo SQL...

    //wxString SQL = wxT("INSERT INTO contatos(ID, NOME, IDADE) VALUES (NULL, 'NOME', IDADE);");

    //Agora adicione as variáveis no lugar dos valores com os sinais de concatenação:

    //wxString SQL = wxT("INSERT INTO contatos(ID, NOME, IDADE) VALUES (NULL, ' + nome + ', + idade + );");

    //Antes de cada + à esquerda da variável adicione ") e depois de cada + à direita da variável adicione wxT("

    //wxString SQL = wxT("INSERT INTO contatos(ID, NOME, IDADE) VALUES (NULL, '") + nome + wxT("',") + idade + (");");

    //Agora executo a função ExecuteUpdate, que vimos no tutorial anterior, passando como
    //parâmetro a wxString SQL...
    db->ExecuteUpdate(SQL);

    //Fecho db...
    CloseDB(db);
}


framep.cpp
//ARQUIVO DO BLOG - http://wxnewbie.blogspot.com
//TUTORIAL wxWidgets + sqlite3 usando wxSqlite3

#include "framep.h"
#include "sqlf.h"

wxFramePrincipal::wxFramePrincipal():wxFrame(NULL, wxID_ANY, wxT("Teste Tutorial Sqlite3"))
{
    //Altero a cor do background do Frame
    this->SetBackgroundColour(*wxWHITE);

    //Meu BoxSizer Principal...
    wxBoxSizer *boxp = new wxBoxSizer(wxVERTICAL);

    //Inicio a construção do grid...
    lista_contatos = new wxGrid(this, ID_GRID);

    //Começo com 0 linhas e 3 colunas, lembre-se que o número de colunas deve ser igual ao numero de campos
    //Da view que iremos carregar ou do comando select que iremos carregar...
    lista_contatos->CreateGrid(0, 3);

    //Aqui altero o valor dos rótulos de cada coluna...
    //Nunca se esqueça, o vetor começa em 0, tanto para colunas como para linhas...
    lista_contatos->SetColLabelValue(0, wxT("ID"));
    lista_contatos->SetColLabelValue(1, wxT("Nome"));
    lista_contatos->SetColLabelValue(2, wxT("Idade"));

    //Altero a largura padrão do rótulo da linha para 25px...
    //Altero a altura padrão do rótulo da coluna para 25px...
    lista_contatos->SetRowLabelSize(25);
    lista_contatos->SetColLabelSize(25);

    //Desabilito a edição dos valores no grid, a alteração de valores será feita
    //pelos wxTextCtrl's
    lista_contatos->EnableEditing(false);

    //Adiciono o grid no BoxSizer principal...
    boxp->Add(lista_contatos, 1, wxEXPAND, 0);

    //Aqui eu adiciono um separador...
    boxp->Add(0, 0, 0, wxALL, 10);

    //Aqui crio um BoxSizer para arranjar os campos de preenchimento de valores...
    wxBoxSizer *box_texts = new wxBoxSizer(wxVERTICAL);

    //o rótulo para o campo nome...
    label_nome = new wxStaticText(this, wxID_ANY, wxT("Nome"));
    //adiciono o rótulo no box dos valores de preenchimento...
    box_texts->Add(label_nome, 0, wxALL, 2);

    //Faço o mesmo que fiz anteriormente para todos os outros campos...
    nome = new wxTextCtrl(this, wxID_ANY, wxEmptyString ,wxDefaultPosition, wxSize(200, -1));
    box_texts->Add(nome, 0, wxALL, 5);

    label_idade = new wxStaticText(this, wxID_ANY, wxT("Idade"));
    box_texts->Add(label_idade, 0, wxALL, 2);

    idade = new wxTextCtrl(this, wxID_ANY, wxEmptyString ,wxDefaultPosition, wxSize(120, -1));
    box_texts->Add(idade, 0, wxALL, 5);

    //Aqui adiciono o box dos campos de preenchimento no box principal...
    boxp->Add(box_texts, 0, wxLEFT, 40);

    //Agora um box para arranjar os botões...
    wxBoxSizer *box_btns = new wxBoxSizer(wxHORIZONTAL);

    //Um separador...
    box_btns->Add(0, 0, 0, wxLEFT, 40);

    //Botão salvar...
    salvar = new wxButton(this, ID_SALVAR, wxT("Salvar"));
    //Adiciono ao box dos botões...
    box_btns->Add(salvar, 0, wxALL, 5);

    limpar = new wxButton(this, ID_LIMPAR, wxT("Limpar Campos"));
    box_btns->Add(limpar, 0, wxALL, 5);

    deletar = new wxButton(this, ID_DELETAR, wxT("Deletar"));
    box_btns->Add(deletar, 0, wxALL, 5);

    //Adiciono o box dos botões ao box principal...
    boxp->Add(box_btns, 1, wxEXPAND, 0);

    //"Digo" ao meu frame que o boxp é o box principal...
    this->SetSizer(boxp);

    //Aqui apenas faço com que tudo seja arranjado de maneira correta...
    this->Layout();

    //Seto o ID como -1 para saber que inicio em modo de inserção...
    ID = -1;
}

//Aqui minha tabela de eventos declarada...
BEGIN_EVENT_TABLE(wxFramePrincipal, wxFrame)
//Veja que digo para cada evento, que o controle que estiver com
//determinado id, é o que será responsável por executá-lo
//No exemplo de salvar:
//Eu digo que é um evento do tipo EVT_BUTTON, ou seja, um evento executado por um botão...
//O botão responsável pelo evento é o que tiver o identificador: ID_SALVAR
//e o evento que ele vai executar é o OnClickSalvar...

//É muito importante o entendimento desta parte para não acontecer nada de errado...
EVT_BUTTON(ID_SALVAR, wxFramePrincipal::OnClickSalvar)
EVT_BUTTON(ID_LIMPAR, wxFramePrincipal::OnClickLimpar)
EVT_BUTTON(ID_DELETAR, wxFramePrincipal::OnClickDeletar)

//Quando você for criar um evento para grid's repare que alguns levam um CMD no nome e outros não...
//Se você estiver criando uma classe derivada de wxGrid, vc não usa o comando que contém o CMD
//Veja que este comando sem CMD como é o caso de EVT_GRID_CELL_LEFT_DCLICK (comando que é executado
//quando dou 2 cliques em uma célula) não recebe ID nenhum como parâmetro...
//agora se eu for executar o mesmo comando usando um wxGrid como controle no meu frame ou dialogo
//eu uso o comando com CMD como é o caso do evento abaixo...
EVT_GRID_CMD_CELL_LEFT_DCLICK(ID_GRID, wxFramePrincipal::OnDoubleClickCell)
END_EVENT_TABLE()

//Aqui eu inicio a implementação do evento para salvar ou editar um registro...
void wxFramePrincipal::OnClickSalvar(wxCommandEvent& event)
{
    //Vamos, primeiro, verificar qual operação será feita
    //Inserção ou Edição
    if(ID == -1)
    {
        //Se a variável ID for = -1, é porque estamos em inserção...
        //Vamos pegar os valores do campo nome...
        wxString get_nome = nome->GetValue();
        //...agora pegamos a idade...
        wxString get_idade = idade->GetValue();

        //E passamos as duas como parâmetros para a função InsertInDB()...
        InsertInDB(get_nome, get_idade);
    }
    else
    {
    }
}

//Aqui o evento que vai limpar os campos...
void wxFramePrincipal::OnClickLimpar(wxCommandEvent& event)
{
    //...Os comandos que usaremos aqui, será escrito depois...
}

//Aqui o evento quando eu clicar no botão deletar...
void wxFramePrincipal::OnClickDeletar(wxCommandEvent& event)
{
    //...Os comandos que usaremos aqui, será escrito depois...
}

//Aqui o evento que será exxecutado
//quando eu der 2 cliques em uma célula...
void wxFramePrincipal::OnDoubleClickCell(wxGridEvent& event)
{
    //...Os comandos que usaremos aqui, será escrito depois...
}

//Esta função eu vou usar para limpar os campos
//como eu precisarei fazer isto sempre que eu completar uma alteração
//vou escrever este código em uma função em separado...
void wxFramePrincipal::LimparCampos()
{
    //...Os comandos que usaremos aqui, será escrito depois...
}

//Aqui vou conferir os campos para ver se o usuário digitou algo errado...
bool wxFramePrincipal::ConfereCampos()
{
    //...Os comandos que usaremos aqui, será escrito depois...
    return true;
}


No próximo tutorial, vamos exibir os valores inseridos no wxGrid.

Até a próxima.

quinta-feira, 8 de setembro de 2011

Tutorial wxWidgets e sqlite3 parte 8 - Criando um banco de dados e a tabela contatos


Hoje vamos criar nosso banco de dados pelo sistema e também criaremos a tabela que iremos utilizar, via código.

Primeiro vamos abrir o projeto da agenda.

Lembrem-se que nossa agenda vai possuir apenas 3 campos:

1 – ID Integer Primary Key
2 – Nome Varchar(50)
3 – Idade Integer

Nossa agenda irá trabalhar da seguinte maneira, ao abrir o sistema, vamos verificar se existe o arquivo “agenda.db3”, se ele não existir, iremos executar uma função que criará o banco de dados e a tabela contatos, ou seja, esta função, teoricamente, será usada apenas uma vez.

Vamos ao código:

Em sqlf.h:
//Esta função será usada para criar o nosso banco de dados
//e também para criar a tabela contatos.
//Ela será executada apenas uma vez...
void CreateDBAgenda();

Em sqlf.cpp:
void CreateDBAgenda()
{
    //Primeiro, vamos pegar o diretório da aplicação mais o nome do banco de dados...
    wxString conf_path = GetExecPath() + wxT("/agenda.db3");

    //Agora vamos verificar se o arquivo já existe...
    //Se existir, paro a execução da função...
    if(wxFileExists(conf_path))
    {
        return;
    }

    //Se ele não existir crio um wxSQLite3Database com este caminho...
    wxSQLite3Database *db = OpenDB(conf_path);

    //Ok, agora criamos um sql com o comando de criação da nossa tabela
    //CREATE TABLE contatos(
    //ID INTEGER PRIMARY KEY,
    //NOME VARCHAR(50),
    //IDADE INTEGER
    //);

    //Vamos adicionar isto em uma wxString

    wxString SQL = wxT("CREATE TABLE contatos(\n");
    SQL += wxT("ID INTEGER PRIMARY KEY,\n");
    SQL += wxT("NOME VARCHAR(50),\n");
    SQL += wxT("IDADE INTEGER\n");
    SQL += wxT(");");

    //Agora vamos usar ExecuteUpdate para executar este SQL...
    //Usamos ExecuteUpdate para criarmos tabelas, views, triggers...
    //Inserir registros no banco de dados...
    //Editar registros no banco de dados...
    //Excluir registros no banco de dados...
    //Não use ExecuteUpdate para seleções...
    db->ExecuteUpdate(SQL);

    //Fechamos a conexão com o banco de dados...
    CloseDB(db);
}

Vejam que usamos a função ExecuteUpdate e passamos como parâmetro, o código SQL de criação do banco de dados.

O que fizemos aqui foi basicamente, verificar se existia um arquivo chamado “agenda.db3” dentro do diretório da aplicação (esta função foi explicada aqui), se ele não existir, crio o mesmo, depois executo o código de criação da tabela contatos e fecho o banco de dados.

Agora vamos chamar esta função em OnInit() do arquivo main.cpp, ficará assim:
bool wxAppTutorial::OnInit(void)
{
    //Criamos o banco de dados e a tabela caso não existam...
    CreateDBAgenda();

Hoje aprendemos como criar um banco de dados e uma tabela usando wxSqlite3, lembre-se que para criarmos uma view ou um gatilho, usamos estes mesmos passos.

Os arquivos modificados ficaram assim:

main.cpp

//ARQUIVO DO BLOG - http://wxnewbie.blogspot.com
//TUTORIAL wxWidgets + sqlite3 usando wxSqlite3

#include "main.h"
#include "framep.h"
#include "sqlf.h"

bool wxAppTutorial::OnInit(void)
{
    //Criamos o banco de dados e a tabela caso não existam...
    CreateDBAgenda();

    //Crio o Frame que vai controlar a aplicação
    wxFramePrincipal *frameprincipal = new wxFramePrincipal();

    //Mostro o Frame
    frameprincipal->Show();

    //Passo para wxApp que este frame irá controlar a aplicação...
    //quando ele for fechado, a aplicação também será fechada...
    SetTopWindow(frameprincipal);

    return true;
}

IMPLEMENT_APP(wxAppTutorial)

sqlf.h

//ARQUIVO DO BLOG - http://wxnewbie.blogspot.com
//TUTORIAL wxWidgets + sqlite3 usando wxSqlite3

#ifndef SQLF_H_INCLUDED
#define SQLF_H_INCLUDED

#include <wx/wx.h>
#include <wx/wxsqlite3.h>
#include <wx/stdpaths.h>

wxString GetExecPath();
//Nesta primeira função, iremos abrir um banco de dados indicado pelo
//parâmetro caminho e retornar um ponteiro para wxSQLite3Database...
//Se o banco de dados não existir, será criado um...
wxSQLite3Database *OpenDB(wxString caminho);
//Aqui iremos apenas fechar o mesmo...
//Isto é necessário, pois liberaremos o arquivo para novos acessos...
void CloseDB(wxSQLite3Database* db);

//Esta função será usada para criar o nosso banco de dados
//e também para criar a tabela contatos.
//Ela será executada apenas uma vez...
void CreateDBAgenda();

#endif // SQLF_H_INCLUDED

sqlf.cpp

//ARQUIVO DO BLOG - http://wxnewbie.blogspot.com
//TUTORIAL wxWidgets + sqlite3 usando wxSqlite3

#include "sqlf.h"

//Função para pegar o diretório da aplicação, já explicada no blog...
wxString GetExecPath()
{
 wxString retorno;
 retorno = wxStandardPaths::Get().GetExecutablePath();
 retorno = wxPathOnly(retorno);
 return retorno;
}

//Vamos implementar nossa função OpenDB...
wxSQLite3Database *OpenDB(wxString caminho)
{
    //Aqui eu crio um ponteiro para um wxSQLite3Database chamado db...
    //É ele que nós retornaremos na função...
    wxSQLite3Database *db = new wxSQLite3Database();

    //Aqui uso a função Open, passando como parâmetro o caminho para o banco de dados...
    //O interessante aqui é vermos que se existir um banco de dados neste lugar a função
    //irá abrir o mesmo, se não existir o banco de dados será criado...
    db->Open(caminho);

    //Vocês poderão ter um problema ao executar esta função, dizendo que Open possui mais de
    //um parâmetro, se isto acontecer, basta usá-la desta maneira:

    //db->Open(caminho, wxEmptyString);

    //O segundo parametro seria a senha para o banco de dados,
    //se estivessemos usando criptografia no mesmo...

    //retornamos o db...
    return db;
}

//Aqui vamos fechar a "conexão" com o banco de dados...
void CloseDB(wxSQLite3Database* db)
{
    //Vemos se db é verdadeiro...
    assert(db != NULL);
    //Fechamos db com o comando Close();
    db->Close();

    //Deletamos db da memória...
    delete db;
}

void CreateDBAgenda()
{
    //Primeiro, vamos pegar o diretório da aplicação mais o nome do banco de dados...
    wxString conf_path = GetExecPath() + wxT("/agenda.db3");

    //Agora vamos verificar se o arquivo já existe...
    //Se existir, paro a execução da função...
    if(wxFileExists(conf_path))
    {
        return;
    }

    //Se ele não existir crio um wxSQLite3Database com este caminho...
    wxSQLite3Database *db = OpenDB(conf_path);

    //Ok, agora criamos um sql com o comando de criação da nossa tabela
    //CREATE TABLE contatos(
    //ID INTEGER PRIMARY KEY,
    //NOME VARCHAR(50),
    //IDADE INTEGER
    //);

    //Vamos adicionar isto em uma wxString

    wxString SQL = wxT("CREATE TABLE contatos(\n");
    SQL += wxT("ID INTEGER PRIMARY KEY,\n");
    SQL += wxT("NOME VARCHAR(50),\n");
    SQL += wxT("IDADE INTEGER\n");
    SQL += wxT(");");

    //Agora vamos usar ExecuteUpdate para executar este SQL...
    //Usamos ExecuteUpdate para criarmos tabelas, views, triggers...
    //Inserir registros no banco de dados...
    //Editar registros no banco de dados...
    //Excluir registros no banco de dados...
    //Não use ExecuteUpdate para seleções...
    db->ExecuteUpdate(SQL);

    //Fechamos a conexão com o banco de dados...
    CloseDB(db);
}

Espero que tenha ajudado e até a próxima.

quarta-feira, 7 de setembro de 2011

Tutorial wxWidgets e sqlite3 parte 7 - Comunicando-se com um banco de dados


Hoje vamos iniciar a programação em si da comunicação entre sqlite3 e wxWidgets usando a biblioteca wxSqlite3.

Primeiro vamos inserir a biblioteca do wxSqlite3 que compilamos anteriormente, ao projeto:

Abra o projeto agenda criado anteriormente no Code::Blocks.
Abra o menu Project->Build options...
Vá na aba Linker settings.
Em link libraries clique no botão Add


Selecione a biblioteca do wxSqlite3 que deve estar em /usr/local/lib


Clique em Ok e salve o projeto.


Primeiro vamos criar duas funções bem básicas, uma será responsável por criar ou abrir um banco de dados em Sqlite3 e a outra será apenas para fechar a comunicação com o banco de dados.

Nos dois casos, a classe responsável por isso é a wxSQLite3Database, ela se encontra no arquivo de cabeçalho wxsqlite3.h, usaremos apenas duas de suas funções, Open() e Close().

Abra o projeto “agenda” criado no tutorial anterior e abra os arquivos sqlf.h e sqlf.cpp para edição.

No arquivo sqlf.h digite o seguinte:

sqlf.h
#ifndef SQLF_H_INCLUDED
#define SQLF_H_INCLUDED

#include <wx/wx.h>
#include <wx/wxsqlite3.h>

//Nesta primeira função, iremos abrir um banco de dados indicado pelo
//parâmetro caminho e retornar um ponteiro para wxSQLite3Database...
//Se o banco de dados não existir, será criado um...
wxSQLite3Database *OpenDB(wxString caminho);
//Aqui iremos apenas fechar o mesmo...
//Isto é necessário, pois liberaremos o arquivo para novos acessos...
void CloseDB(wxSQLite3Database* db);

#endif // SQLF_H_INCLUDED

No arquivo sqlf.cpp digite o seguinte:

sqlf.cpp
#include "sqlf.h"

//Vamos implementar nossa função OpenDB...
wxSQLite3Database *OpenDB(wxString caminho)
{
    //Aqui eu crio um ponteiro para um wxSQLite3Database chamado db...
    //É ele que nós retornaremos na função...
    wxSQLite3Database *db = new wxSQLite3Database();

    //Aqui uso a função Open, passando como parâmetro o caminho para o banco de dados...
    //O interessante aqui é vermos que se existir um banco de dados neste lugar a função
    //irá abrir o mesmo, se não existir o banco de dados será criado...
    db->Open(caminho);

    //Vocês poderão ter um problema ao executar esta função, dizendo que Open possui mais de
    //um parâmetro, se isto acontecer, basta usá-la desta maneira:

    //db->Open(caminho, wxEmptyString);

    //O segundo parametro seria a senha para o banco de dados,
    //se estivessemos usando criptografia no mesmo...

    //retornamos o db...
    return db;
}

//Aqui vamos fechar a "conexão" com o banco de dados...
void CloseDB(wxSQLite3Database* db)
{
    //Vemos se db é verdadeiro...
    assert(db != NULL);
    //Fechamos db com o comando Close();
    db->Close();

    //Deletamos db da memória...
    delete db;
}


Um exemplo de como utilizar as funções seria o seguinte, imagine que temos um arquivo em /home/usuario/banco.db e queremos abrí-lo:

//Vamos abrir o banco...
wxSQLite3Database *m_db = OpenDB(wxT(“/home/usuario/banco.db”));
//Aqui executo as operações desejadas, como inserir um dado ou fazer uma seleção...
…
//Aqui fechamos a conexão com o banco de dados...
CloseDB(m_db);

Bem fácil, não?

No próximo tutorial iremos criar o banco de dados da agenda pelo programa e faremos uma função para selecionarmos os dados do banco de dados.

Até a próxima.

sexta-feira, 19 de agosto de 2011

wxWidgets – Utilizando o Projeto Base

Hoje vamos ver como iniciar um novo projeto tomando como base o projeto criado no tutorial anterior.

1 – Abra o Visual C++.

2 – Crie uma pasta em algum local do seu computador para salvar o projeto.

3 – Abra o projeto que você criou que foi explicado aqui.

4 – Remova os arquivos “minimal.cpp” e “sample.rc”.


5 – Salve tudo, em “File”->”Save All”.

Será criado um arquivo com a extensão “*.sln”, clique em salvar.


6 – Agora vamos criar o novo projeto, clique sobre o nome do projeto e vá em “File”->“Save minimal As”, selecione a pasta que você criou e digite um nome qualquer, no meu caso, será “tutorial_sqlite3”, pois vou usá-lo para os tutoriais do sqlite3.




7 – Feche o projeto “minimal” e quando for perguntado se você quer salvar este projeto, clique em “NO”, não se esqueça de sempre que for criar um projeto novo a partir deste, nunca salvar o projeto “minimal”.

8 – Agora vamos abrir o diretório onde você salvou o projeto novo.

Clique com o botão direito do mouse sobre o arquivo de projeto e selecione abrir com o bloco de notas.

Por padrão, o bloco de notas não é um aplicativo indicado pelo Windows para abrir arquivos “*.vcproj”, você deve selecioná-la usando a opção “Escolher programa padrão...”.


9 – Com o programa aberto no Bloco de Notas, vá em “Editar”->”Substituir”, 


No campo Localizar: coloque “minimal”

Em Substituir por: coloque o nome do seu novo projeto (no meu caso “tutorial_sqlite3”)
Clique em “Substituir Tudo”


Feche esta janela, salve o arquivo e feche o Bloco de Notas.

O projeto está pronto para ser utilizado, no próximo tutorial iremos começar a explicação sobre o sqlite3.
Até a próxima.

Vídeo com as explicações.

domingo, 14 de agosto de 2011

Tutorial wxWidgets e sqlite3 parte 3 – Criando um banco de dados pelo Black Cat - SQLite3 database manager

Para começarmos, faça o download do aplicativo neste link:


Instale o aplicativo e abra o mesmo:

Ao abrir, clique em OK:




Na janela que se abre, selecione os valores da seguinte maneira:

Em Database file, selecione o local onde quer criá-lo e digite o nome do arquivo.

Em DLL driver: deixe como está.

Em Collate deixe como está.

Selecione a caixa “Create IF do not exists”.

Clique em Connect.


Na janela principal, clique com o botão direito do mouse sobre “Tables” na lista a esquerda e selecione “Create new table”.


Na janela que se abre, um diálogo para inserir o primeiro campo é aberta, digite os dados do campo e clique em OK.




Clique com o botão direito no “Grid” da janela “create new table” e selecione, no popup menu, “Add new field”



Repita a operação para inserir um novo campo à tabela, com os valores do nome e idade como no tutorial passado:



Altere o nome da tabela no campo “Table name”



Clique no botão “Create table” como mostra a figura:
  


Uma nova aba é mostrada com o comando SQL para a criação da tabela, nesta aba clique no botão “Execute”:



A tabela está criada:



Esta ferramenta simplifica o processo de criação dos bancos de dados, assim como as edições dos mesmos, como para cada ação, um comando SQL é exibido, também serve como uma ferramenta interessante no processo de aprendizado do SQL.

Até a próxima.

Tutorial wxWidgets e sqlite3 parte 2 – Criando um banco de dados pelo prompt de comando.

Hoje veremos como criar um banco de dados no sqlite3, este banco de dados será utilizado nos próximos tutoriais, explicarei como fazê-lo de 2 formas diferentes, a primeira utilizando o prompt de comando (ou terminal) e a segunda maneira utilizando um manager para criação de banco de dados sqlite3, o Black Cat.
Após iniciarmos com a programação em si, explicarei como criá-lo também utilizando o wxsqlite3.
O banco de dados em questão será chamado de “agenda”, ele será muito simples, para facilitar a explicação posterior:

Banco de Dados: agenda.db3
Tabela: contatos
Campos:
ID - Integer e Primary Key;
Nome - Varchar com tamanho igual a 50;
Idade – Integer.

Teremos apenas 3 campos, trabalhando assim, ficará mais fácil a compreensão do tutorial como um todo.

Para iniciar eu criarei uma pasta no desktop com o nome de “tutorial1”, lembre-se de criar um diretório sem espaços ou caracteres especiais.

Vamos começar...

Sempre que verem isto -> [Enter], significa que você deve pressionar a tecla “Enter” após o comando.

Após configurar o sqlite3 no path do sistema, como explicado anteriormente aqui, abra o prompt de comando:

Vá para o diretório onde será criado o banco de dados, no meu caso em C:\Users\Alex\Desktop\tutorial1, digitando o seguinte no terminal:
1 - cd C:\Users\Alex\Desktop\tutorial1 [Enter]


2 – Agora criaremos o banco de dados digitando o seguinte:
sqlite3 agenda.db3 [Enter]


3 – Agora é a hora de criarmos a tabela, aqui devemos lembrar sempre que para fechar um comando em sqlite3 sempre devemos terminá-lo com “;”, digite o seguinte comando:
CREATE TABLE contatos( [Enter]
ID INTEGER PRIMARY KEY, [Enter]
NOME VARCHAR(50), [Enter]
IDADE INTEGER [Enter]
); [Enter]
Neste ponto, nossa tabela está criada.


Para confirma a criação da mesma, execute um SELECT:
SELECT COUNT(ID) FROM contatos;


Se não houverem erros é porque está tudo OK.
Vá até o diretório onde você criou o banco de dados e veja se o mesmo está lá.



Para fechar o sqlite3 digite:
.quit [Enter]

Você voltará para o diretório.

No próximo tutorial explicarei como criar este mesmo banco de dados no Black Cat, enquanto isso vá criando outros bancos de dados e testando outros comando SQL, como INSERT, SELECT, UPDATE, etc.

Até a próxima.

Vídeo com a explicação:


Tutorial wxWidgets e sqlite3 parte 1 – Configurando sqlite3 no Windows

Os passos para configurar o sqlite3 no Windows são os seguintes:

1 – Faça o download da ferramenta de linha de comando no seguinte link:

2 - Descompacte o arquivo e veja que ali existe um executável, é esta a ferramenta que iremos utilizar para criação e edição de bancos de dados no próximo tutorial.


3 – Copie este executável para um local de fácil acesso, e onde você não vá removê-lo, no meu caso eu costumo criar um diretório no disco local: “X:\sqlite” onde X seria a letra que representa o disco.


4 – Agora que o executável está neste local, vamos adicioná-lo a path do sistema:
Clique com o botão direito sobre o ícone “Computador”, selecione “Propriedades”.


Se você estiver no XP a caixa de diálogo com as “Propriedades do Sistema” já se abrirá, no Windows 7 clique em “Configurações avançadas do sistema” na lista à esquerda.


Em “Propriedades do Sistema”, clique em “Variáveis de Ambiente”.


Em Variáveis do Sistema, procure a variável Path, selecione a mesma e clique em “Editar...”


No final do “Valor da variável”, digite um ponto e virgula e o diretório para onde você moveu o sqlite3, no meu caso C:\sqlite.
Clique em OK e caso abram outros diálogos de confirmação, clique em Ok para todos.


5 – Se tudo ocorreu da forma esperada, o sqlite3 já estará sendo executado pelo Prompt de Comando em qualquer diretório que você estiver.
Para testar, abra o “Prompt de Comando” e digite “sqlite3”, se estiver OK você verá a mensagem como na figura.


Para o Linux, não existe a necessidade de configuração do sqlite3, se ele estiver instalado você precisa apenas abrir o terminal e chamá-lo pelo comando “sqlite3”.

No próximo tutorial iremos criar o primeiro banco de dados no sqlite3, usando a linha de comando.

Até a próxima.


Vídeo com a explicação: