A Base de Dados SQLite é conhecida por ser muito leve, rápida e por ser utilizada em várias aplicações que necessitam de uma base de dados confiável e robusta. Atualmente a base de dados SQLite é muito utilizada em dispositivos móveis como Android, Iphone e Ipad.
Antigamente para utilizar a base de dados SQLite em .NET era um pouco complicado, porque precisavamos utilizar as DLLs do SQLite através do PInvoke em .NET. Agora no site oficial do
SQLite foi inserida a biblioteca
System.Data.SQLite para ser utilizada em aplicações .NET.
Para este post criei uma Aplicação Console para manipular as informações de uma base de dados de livros. Nesta aplicação o usuário poderá cadastrar, excluir, alterar e visualizar os livros existentes na base de dados.
Para utilizar a biblioteca do SQLite em .NET é necessário fazer o download da biblioteca e instalar na máquina de desenvolvimento. A biblioteca pode ser baixada no site oficial do
SQLite.
No projeto Console no Visual Studio é necessário incluir uma referência à Dll
System.Data.SQLite.dll, que normalmente é instalada no diretório C:\Arquivos de Programas\System.Data.SQLite\2008\bin.
No projeto Console foi criada a classe
SqliteDb que possui os métodos para inserir, alterar e excluir dados da base SQLite, a classe auxiliar
Livro (Listagem 1) que é utilizada para armazenar os dados do livro que está sendo utilizado pelos outros métodos e a classe
Program que possui o método
Main e outros métodos auxiliares para executar a aplicação.
Listagem 1:
public class Livro
{
public long id { get; set; }
public string titulo { get; set; }
public string autor { get; set; }
public string ano { get; set; }
public string genero { get; set; }
}
A seguir são detalhados os métodos que fazem parte da classe
SqliteDb:
Foram criadas duas constantes, uma para definir o nome da base de dados e a outra para definir a conexão com a base de dados SQLite.
const string DATABASE_NAME = "livros_classicos.db";
const string CONNECTION = "Data Source=" + DATABASE_NAME;
O método
CreateDatabase() cria a base de dados
livros_classicos.db, se não existir e cria a tabela
livros:
public void CreateDatabase()
{
SQLiteConnection conn = new SQLiteConnection(CONNECTION);
try
{
if (!File.Exists(DATABASE_NAME))
{
SQLiteConnection.CreateFile(DATABASE_NAME);
// Cria a tabela livros
conn.Open();
SQLiteCommand cmd = new SQLiteCommand();
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "CREATE TABLE livros (" +
"id INTEGER NOT NULL PRIMARY KEY," +
"titulo TEXT," +
"autor TEXT," +
"ano_publicacao TEXT," +
"genero TEXT)";
cmd.ExecuteNonQuery();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
if (conn != null)
{
conn.Close();
}
}
}
O método
InsertLivro(Livro) insere um livro na base:
public bool InsertLivro(Livro livro)
{
bool resultado = false;
SQLiteConnection conn = new SQLiteConnection();
try
{
conn.ConnectionString = CONNECTION;
conn.Open();
SQLiteCommand cmd = new SQLiteCommand();
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@Titulo", livro.titulo);
cmd.Parameters.AddWithValue("@Autor", livro.autor);
cmd.Parameters.AddWithValue("@Ano", livro.ano);
cmd.Parameters.AddWithValue("@Genero", livro.genero);
cmd.CommandText = "INSERT INTO livros " +
"(titulo, autor, ano_publicacao, genero) " +
"VALUES (@Titulo, @Autor, @Ano, @Genero)";
int registro = cmd.ExecuteNonQuery();
// Verifica se o registro foi inserido
if (registro == 1)
{
resultado = true;
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
if (conn != null)
{
conn.Close();
}
}
O método
SearchLivro(string) faz a procura de livros por título e retorna a lista de livros filtrados. Neste método optei em fazer uma busca utilizando o operador LIKE do SQL para fazer uma busca por padrão e não uma busca exata.
public List<Livro> SearchLivro(string titulo)
{
List<Livro> livros = new List<Livro>();
SQLiteConnection conn = new SQLiteConnection();
try
{
conn.ConnectionString = CONNECTION;
conn.Open();
SQLiteCommand cmd = new SQLiteCommand();
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@Titulo", titulo);
cmd.CommandText = "SELECT * FROM livros WHERE titulo LIKE '%"
+ titulo + "%'";
SQLiteDataReader reader = cmd.ExecuteReader();
while (reader.Read() == true)
{
Livro livro = new Livro();
livro.id = (long)reader["id"];
livro.titulo = (string)reader["titulo"];
livro.autor = (string)reader["autor"];
livro.ano = (string)reader["ano_publicacao"];
livro.genero = (string)reader["genero"];
livros.Add(livro);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
if (conn != null)
{
conn.Close();
}
}
return livros;
}
O método
UpdateLivro(Livro) atualiza os dados do livro.
public string UpdateLivro(Livro livro)
{
string resultado = "";
SQLiteConnection conn = new SQLiteConnection();
try
{
conn.ConnectionString = CONNECTION;
conn.Open();
SQLiteCommand cmd = new SQLiteCommand();
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@Id", livro.id);
cmd.Parameters.AddWithValue("@Titulo", livro.titulo);
cmd.Parameters.AddWithValue("@Autor", livro.autor);
cmd.Parameters.AddWithValue("@Ano", livro.ano);
cmd.Parameters.AddWithValue("@Genero", livro.genero);
cmd.CommandText = "UPDATE livros SET titulo=@Titulo, autor=@Autor," +
" ano_publicacao=@Ano, genero=@Genero WHERE id=@Id";
int registroAtualizado = cmd.ExecuteNonQuery();
if (registroAtualizado == 1)
{
resultado = "O livro foi atualizado com sucesso.";
}
else
{
resultado = "O livro não foi atualizado.";
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
if (conn != null)
{
conn.Close();
}
}
return resultado;
}
O método
DeleteLivro(string) apaga o livro filtrado, na base de dados, através do id do livro.
public string DeleteLivro(string id)
{
string resultado = "";
SQLiteConnection conn = new SQLiteConnection();
try
{
conn.ConnectionString = CONNECTION;
conn.Open();
SQLiteCommand cmd = new SQLiteCommand();
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@Id", id);
cmd.CommandText = "DELETE FROM livros WHERE id=@Id";
int registroAtualizado = cmd.ExecuteNonQuery();
if (registroAtualizado == 1)
{
resultado = "O livro foi excluído com sucesso.";
}
else
{
resultado = "O livro não foi excluído.";
}
}
catch (Exception ex)
{
resultado = ex.Message;
}
return resultado;
}
}
A seguir são detalhados os métodos que fazem parte da classe
Program:
O método Main é o responsável pela inicialização e execução da aplicação:
static void Main(string[] args)
{
ConsoleKeyInfo key = new ConsoleKeyInfo();
Console.WriteLine("Digite S a qualquer momento" +
" para sair da aplicação!");
SqliteDb sqlitedb = new SqliteDb();
// Cria a base de dados se não existir
sqlitedb.CreateDatabase();
while (true)
{
Console.WriteLine("Digite I para incluir, A para alterar," +
" E para excluir, P para pesquisar e V para visualizar todos os livros:");
// Lê a tecla digitada
key = Console.ReadKey(true);
// Sai da aplicação
if (key.KeyChar == 'S' || key.KeyChar == 's')
{
break;
}
// Pesquisa um livro por título
if (key.KeyChar == 'P' || key.KeyChar == 'p')
{
Console.WriteLine("Digite o título do livro a ser pesquisado:");
string titulo = Console.ReadLine();
// Exibe as informações do livro
BuscarLivro(titulo);
}
// Inclui um livro
if (key.KeyChar == 'I' || key.KeyChar == 'i')
{
// Lê as informações do livro a ser inserido
Livro livro = GetLivro();
// Insere o livro
if (sqlitedb.InsertLivro(livro) == true)
{
Console.WriteLine("O livro foi incluído com sucesso!");
}
}
// Exclui um livro
if (key.KeyChar == 'E' || key.KeyChar == 'e')
{
Console.WriteLine("Digite o título do livro a ser excluído:");
string titulo = Console.ReadLine();
// Buscar o livro
List<Livro> livros = BuscarLivro(titulo);
// Obtêm o Id do livro a ser excluído
string id = GetId(livros);
if (id != "")
{
// Exclui o livro
string resultado = sqlitedb.DeleteLivro(id);
Console.WriteLine(resultado);
}
}
// Altera um livro
if (key.KeyChar == 'A' || key.KeyChar == 'a')
{
Console.WriteLine("Digite o título do livro a ser alterado:");
string titulo = Console.ReadLine();
// Buscar livro
List<Livro> livros = BuscarLivro(titulo);
// Obtêm o Id do livro a ser alterado
string id = GetId(livros);
if (id != "")
{
// Lê as novas informações do livro a ser alterado
Livro livro = GetLivro();
// Atualiza o valor do id
livro.id = long.Parse(id); ;
// Altera as informações do livro
string resultado = sqlitedb.UpdateLivro(livro);
Console.WriteLine(resultado);
}
}
}
}
O método possui um loop
while que apresenta um menu para que o usuário possa selecionar a função que deseja executar ou sair da aplicação. Quando a aplicação é executada é apresentado o seguinte menu:
Digite S a qualquer momento para sair da aplicação!
Digite I para incluir, A para alterar, E para excluir, P para pesquisar e V para
visualizar todos os livros:
Além do método
Main a classe
Program possui também os métodos
BuscarLivro(string),
GetId(List<Livro) e
GetLivro().
O método
BuscarLivro(string) faz a busca dos livros por título e retorna uma lista de livros.
private static List<Livro> BuscarLivro(string titulo)
{
SqliteDb sqlitedb = new SqliteDb();
List<Livro> livros = sqlitedb.SearchLivro(titulo);
Console.WriteLine();
foreach (Livro item in livros)
{
Console.WriteLine(item.id + "\t" + item.titulo + "\t" + item.autor + "\t" +
item.ano + "\t" + item.genero);
}
Console.WriteLine();
return livros;
}
O método
GetId(List<Livro> livros) faz a busca dos livros e retorna o id do livro.
private static string GetId(List<Livro> livros)
{
// Digitar o id do livro a ser alterado se houver mais de
// um livro como resultado
string id = "";
if (livros.Count == 0)
{
Console.WriteLine("O livro não foi encontrado.");
}
else if (livros.Count == 1)
{
id = livros[0].id.ToString();
}
else
{
Console.WriteLine("Digite o id do livro a ser alterado:");
id = Console.ReadLine();
}
return id;
}
O método
GetLivro() retorna um objeto livro com os detalhes do livro.
private static Livro GetLivro()
{
Livro livro = new Livro();
Console.WriteLine("Digite o título do livro:");
livro.titulo = Console.ReadLine();
Console.WriteLine("Digite o autor do livro:");
livro.autor = Console.ReadLine();
Console.WriteLine("Digite o ano de publicação do livro:");
livro.ano = Console.ReadLine();
Console.WriteLine("Digite o gênero do livro:");
livro.genero = Console.ReadLine();
return livro;
}