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