• Skip to content
  • Skip to primary sidebar
  • Skip to footer

R Andrade

Blog do Paulo Roberto - Desenvolvimento e arquitetura

Inserindo dados com SQLite, C# e sqlite-net-pcl

9 de abril de 2018 by Paulo Roberto Ramos de Andrade 2 Comments

Olá pessoal! Tudo bem? Agora que já sabemos como criar tabelas com o SQLite puro e com o sqlite-net-pcl, vamos aprender com mais detalhes como inserir dados nas tabelas criadas, afinal de contas. Como sempre, vamos usar o sqlite-net-pcl como plugin de acesso a bancos de dados SQLite e o PCLExt.Storage como plugin para facilitar o acesso a arquivos locais – principalmente o próprio banco de dados SQLite que será usado durante o artigo. Da mesma forma como foi feito nos outros artigos, vamos usar os plugins para, dentro da pasta da aplicação, criar ou abrir o arquivo banco.db como um banco de dados SQL.

IFolder pasta = new ApplicationRootFolder(); // new LocalRootFolder() no Xamarin.Forms
IFile arquivo = pasta.CreateFile("banco.db", CreationCollisionOption.OpenIfExists);
SQLiteConnection conexao = new SQLiteConnection(arquivo.Path);

Vamos usar a mesma tabela Contato como exemplo de inserção de dados. Imagine que o seguinte comando já foi executado no SQLite – o que significa que já temos a tabela Contato devidamente criada.

conexao.Execute("CREATE TABLE contato IF NOT EXISTS (" +
                  "contato_id integer PRIMARY KEY AUTOINCREMENT," +
                  "nome text NOT NULL," +
                  "data_nasc integer NOT NULL," +
                  "sobrenome text NOT NULL," +
                  "email text NOT NULL UNIQUE," +
                  "telefone text NOT NULL UNIQUE)");

A inserção de dados pode ser feita através da instrução sqlite INSERT INTO, onde informamos a tabela que recebeá os dados, a lista de campos e de valores. De forma genérica, o comando é assim:

INSERT INTO nometabela (campo1, campo2, campo3) 
values (value1, value2 value3)

No caso da tabela contato, a inserção de dados pode ser feita com o seguinte comando:

INSERT INTO contato (nome, data_nasc, sobrenome, email, telefone) 
VALUES ('Fulano','624810240000000000','Da Silva','[email protected]','1234-5678')

Como o SQLite não tem um tipo de dados que representa datas, estamos usando os Ticks de uma data do C# para o campo data_nasc. Note também que estamos cercando os dados com aspas simples, embora isto não seja obrigatório com dados numéricos – como o próprio campo data_nasc. E podemos normalmente mudar a ordem dos campos dentro da instrução INSERT INTO, sem precisar seguir a mesma ordem dos campos na tabela. Podemos até mesmo tirar campos da instrução, embora isto só funcione se os campos aceitarem valores nulos (o que não é o caso da tabela contato) ou se forem programados para auto incrementação (como é o caso do campo contato_id, que não estamos discriminando nos comandos).

INSERT INTO contato (nome, sobrenome, data_nasc, email, telefone) 
VALUES ('Beltrano','Perez', 624810240000000000, '[email protected]','1234-1234')

Podemos também simplesmente não listar os campos, o que nos obriga a colocar todos os dados na ordem que os campos foram criados na tabela – e isso inclui até a chave primária contato_id. Veja o exemplo abaixo:

INSERT INTO contato VALUES (5, 'Fulana',624810240000000000,'Souza','[email protected]','4321-5678')

Por último, podemos inserir vários dados numa única instrução INSERT INTO, simplesmente separando cada nova linha de dados com uma vírgula. Exatamente como o exemplo abaixo:

INSERT INTO contato (nome, data_nasc, sobrenome, email, telefone) values
('Fulano1', 624810240000000000, 'Matos', '[email protected]', '5678-1234'),
('Fulano2', 624810240000000000, 'Matos', '[email protected]', '5678-4321'),
('Fulano3', 624810240000000000, 'Matos', '[email protected]', '6987-4563')

Todos os exemplos feitos até aqui podem ser executados no sqlite-net-pcl apenas usando o método Execute. Da seguinte forma:

<br />conexao.Execute("INSERT INTO contato (nome, data_nasc, sobrenome, email, telefone) " +
                "VALUES ('Fulano','624810240000000000','Da Silva','[email protected]','1234-5678')");

conexao.Execute("INSERT INTO contato (nome, sobrenome, data_nasc, email, telefone) " +
                "VALUES ('Beltrano','Perez', 624810240000000000, '[email protected]','1234-1234')");

conexao.Execute("INSERT INTO contato VALUES (5, 'Fulana',624810240000000000,'Souza','[email protected]','4321-5678')");

conexao.Execute("INSERT INTO contato (nome, data_nasc, sobrenome, email, telefone) values" +
"('Fulano1', 624810240000000000, 'Matos', '[email protected]', '5678-1234')," +
"('Fulano2', 624810240000000000, 'Matos', '[email protected]', '5678-4321')," +
"('Fulano3', 624810240000000000, 'Matos', '[email protected]', '6987-4563')" );

E se nós [usarmos o DB Browser for SQLite][l3] para visualizar o banco de dados, podemos ver todas as informações devidamente persistidas – note como a chave primária automática do campo contato_id tem seu auto incremental modificado, depois que inserimos uma informação com chave primária específica.

Obviamente, o sqlite-net-pcl facilita e muito o trabalho de inserção de dados. Como já sabemos, a criação da tabela Contato se resume ao comando CreateTable, admitindo que a classe Contato exista.

class Contato
{
    [PrimaryKey, AutoIncrement]
    public int Contato_Id { get; set; }

    [NotNull]
    public string Nome { get; set; }

    [NotNull]
    public string Sobrenome { get; set; }

    [NotNull, Unique]
    public string Email { get; set; }

    [NotNull]
    public DateTime Data_Nasc { get; set; }

    [Unique, NotNull]
    public string Telefone { get; set; }
}

conexao.CreateTable<Contato>();

Já que temos o objeto Contato, simplesmente podemos usar o comando Insert para inserir um objeto. Não precisamos definir para qual tabela o objeto será persistido, porque o sqlite-net-pcl já faz a ligação – se estamos persistindo um objeto do tipo Contato, será na tabela Contato.

var contato1 = new Contato
{
    Data_Nasc = new DateTime(1980, 12, 12),
    Email = "[email protected]",
    Nome = "Fulano",
    Sobrenome = "da Silva",
    Telefone = "1234-5678"
};
conexao.Insert(contato1);

Evidentemente, não precisamos nos preocupar com a ordem de atribuição dos dados – desde que todos os dados obrigatórios sejam preenchidos, claro.

var contato2 = new Contato
{
    Nome = "Beltrano",
    Sobrenome = "Perez",
    Data_Nasc = new DateTime(1980, 12, 12),
    Email = "[email protected]",
    Telefone = "1234-1234"
};
conexao.Insert(contato2);

Ao contrário do que o SQLite puro permite, não podemos incluir dados com uma chave primária específica usando os métodos do sqlite-net-pcl. O dado será inserido normalmente, mas a informação que estiver na chave primária – neste caso, Contato_Id – será ignorada.

var contato3 = new Contato
{
    Contato_Id = 5,
    Nome = "Fulana",
    Sobrenome = "Souza",
    Data_Nasc = new DateTime(1980, 12, 12),
    Email = "[email protected]",
    Telefone = "4321-5678"
};
conexao.Insert(contato3);

Para inserir mais de um dado ao mesmo tempo, simplesmente criamos uma lista com os objetos e usamos o método InsertAll. Todos os objetos serão inseridos de uma só vez!

var contato4 = new Contato
{
    Data_Nasc = new DateTime(1980, 12, 12),
    Email = "[email protected]",
    Nome = "Fulano1",
    Sobrenome = "Matos",
    Telefone = "5678-1234"
};
var contato5 = new Contato
{
    Data_Nasc = new DateTime(1980, 12, 12),
    Email = "[email protected]",
    Nome = "Fulano2",
    Sobrenome = "Matos",
    Telefone = "5678-4321"
};
var contato6 = new Contato
{
    Data_Nasc = new DateTime(1980, 12, 12),
    Email = "[email protected]",
    Nome = "Fulano3",
    Sobrenome = "Matos",
    Telefone = "6987-4563"
};

var lista  = new List<Contato>()
{
    contato4,
    contato5,
    contato6
};

conexao.InsertAll(lista);

Veja o resultado, com todos os dados persistidos.

Só que o sqlite-net-pcl apresenta um método extra para facilmente substituir dados no banco de dados – InsertOrReplace. Se usamos este método e qualquer um dos campos quebrar com a configuração Unique da tabela, o dado antigo é substituído pelo novo. Veja o objeto abaixo, por exemplo. Configuramos o campo Email como Unique, o que significa que, no Insert normal, o novo objeto não será salvo e o sqlite-net-pcl retornará um erro – porque já inserimos uma informação com o mesmo e-mail. Com o InsertOrReplace, o dado antigo será apagado e novo dado será salvo.

var contatoExtra = new Contato()
{
    Data_Nasc = new DateTime(1980, 12, 12),
    Email = "[email protected]",
    Nome = "Fulano Extra",
    Sobrenome = "da Silva",
    Telefone = "5555-1234"
};
conexao.InsertOrReplace(contatoExtra);

Veja como a primeira linha da tabela é trocada pelo novo dado.

Desta forma, conseguimos inserir dados tanto usando instruções SQL puras quanto o sqlite-net-pcl, que facilita e muito o trabalho. Até a próxima!

[]’s
Paulo Roberto

Filed Under: C#, Mobile, Todas as postagens, Xamarin Tagged With: .net, banco de dados, c#, injeção de dependência do xamarin.forms, mobile, plug-ins xamarin.forms, sqlite, visual studio, xamarin, xamarin.android, xamarin.forms, xamarin.ios

Publicidade

Primary Sidebar

Quem sou eu

Meu nome é Paulo Roberto e tenho 32 anos, com 12 anos de experiência na área. Sou desenvolvedor, autodidata, iniciante nas artes da arquitetura de softwares, eterno interessado em aprender mais técnicas e tecnologias e também interessado em documentar e repassar o pouco que já sei.

Acompanhe o blog nas redes sociais

  • Email
  • Facebook
  • Github
  • Linkedin
  • Twitter

Publicidade

O que foi mais lido no último mês

  • Apagando dados com SQLite, C# e sqlite-net-pcl
  • Convertendo tabelas HTML em arquivos Excel no Front End
  • Trabalhando com o simulador do iOS
  • Tokens de acesso: Primeiro passo para proteger WebApis

Categorias

Arquitetura de Sistemas ASP.NET MVC ASP.NET Web Api Autenticação e Autorização C# Cors Dicas e Truques Entity Framework JavaScript Mobile N Camadas OWIN Pessoal Segurança Sites que ajudam Softwares Todas as postagens Unit Testing Virtualização Xamarin Xaml

Footer

Pesquisar

Arquivo do blog

Copyright © 2019 · Magazine Pro on Genesis Framework · WordPress · Log in