×
Namespaces

Variants
Actions

Como usar o SQLite no Windows Phone

From Nokia Developer Wiki
Jump to: navigation, search

Este artigo explica como configurar e utilizar o banco de dados SQLite no Windows Phone 8.

WP Metro Icon File.png
WP Metro Icon WP8.png
Article Metadata

Exemplo de código
Código fonte: Media:SQLiteForWP8.zip

Testado com
SDK: Windows Phone SDK 8.0
Aparelho(s): Lumia 820

Compatibilidade
Plataforma(s):
Windows Phone 8

Artigo
Tradução:
Por mfabiop
Última alteração feita por mfabiop em 15 Mar 2014

Contents

Introdução

Uma tarefa muito comum na maioria das aplicações é o armazenamento de dados para acesso posterior. Esta é a razão pela qual plataformas móveis provêem formas para o desenvolvedor manipular esses dados de forma fácil. Com Windows Phone 8 não é diferente, ele provê o namespace System.IO.IsolatedStorage para acessar arquivos e/ou configurações da aplicação.

Normalmente isto é o bastante para muitas aplicações, mas para dados mais estruturados talvez um banco de dados se encaixe melhor. Este artigo é sobre o uso do banco de dados SQLite para manipular dados estruturados.

No momento da escrita deste artigo, não é muito fácil começar uma aplicação que utilize SQLite no Windows Phone 8. Logo, a primeira parte deste artigo irá tratar sobre esta tarefa de configuração. A segunda parte irá mostrar como criar uma conexão, um banco de dados, tabelas e como armazenar e acessar dados. A primeira parte pode ser atualizada no futuro, quando o método de configuração se tornar mais simples.

Artigo atualizado (15 de Março de 2014): Este é a primeira grande atualização deste artigo. Um ano após, a forma de instalar o suporte ao SQLite para Windows Phone 8 mudou e está muito mais fácil agora.

Tip.pngDica: Este artigo trata somente de Windows Phone 8. Se você quer desenvoler uma aplicação baseada em banco de dados para Windows Phone 7, então recomendamos que você use a biblioteca sqlitewindowsphone como descrito neste post. Testes comprovaram que ela funciona perfeitamente no Lumia 800!

Integrando o SQLite em uma aplicação Windows Phone 8

Este artigo irá usar um exemplo simples para instalar o suporte ao SQLite e manipular o banco de dados. Logo, a primeira coisa que você deve fazer é criar uma projeto Windows Phone vazio. Será assumido que o nome deste projeto é "SqliteForWP8".

Antes de tudo, é necessário dizer que todo o trabalho para adicionar suporte ao SQLite descrito neste artigo é baseado neste post (http://wp.qmatteoq.com/working-with-sqlite-in-windows-phone-8-a-sqlite-net-version-for-mobile/) escrito por User:qmatteoq . Eu irei somente filtrar o post e colocar aqui somente os passos necessários. Se você quiser mais detalhes sobre porquê estes passos são necessário e estiver com o inglês em dia, dê uma olhada neste post. Existem muitas informações úteis lá.

Instalando o 'SQLite for Windows Phone SDK'

Vamos agora instalar o SQLite for Windows Phone SDK no seu Visual Studio 2012. Para isto, clique em TOOLS -> Extensions and Updates -> Online -> (Então procure por "sqlite for windows phone"). Este passo deve ser semelhante com a figura abaixo.

SQLite-For-WP8-Install-Step-1.png

Clique em Download. Você terá que reiniciar o Visual Studio depois que baixar o arquivo. A imagem abaixo será mostrada quando a instalação estiver concluída.

SQLite-For-WP8-Install-Step-2.png

Instalando o pacote sqlite-net-wp8

O pacote sqlite-net-wp8 é o código entre o SQLite for Windows Phone SDK e o seu código. Os passos para instalar este pacote são: Clique com o botão direito no projeto "SqliteForWP8" (Não na solução) -> Clique na opção "Manage NuGet Packages" e procure por "sqlite-net-wp8" -> Quando encontrar o pacote, clique no botão Install. No momento da escrita deste artigo a versão mais recente é a 3.8.3.100 e foi criado por "Peter Huene". Use a imagem abaixo como referência para te guiar na instalação do pacote correto.

Sqlite-net-wp8-Install-Step-1.png

Instalando o pacote sqlite-net

O pacote sqlite-net provê um códgo de ajuda (SQLite.cs and SQLiteAsync.cs) que você irá usar para manipular o banco de dados sqlite; armazenando e recuperando dados. Os passos para instalar este pacote são: Clique com o botão direito no projeto "SqliteForWP8" (Não na solução) -> Clique na opção "Manage NuGet Packages" e procure por "sqlite-net-wp8" -> Quando encontrar o pacote, clique no botão Install. No momento da escrita deste artigo a versão mais recente é a 1.0.8 e foi criado por "Frank Krueger". Use a imagem abaixo como referência para te guiar na instalação do pacote correto.

Sqlite-net-Install-Step-1.png

Você irá provavelmente receber esta mensagem de erro na tela: The type or namespace name 'Community' could not be found. Corriga isto seguindo os seguinte passos: Crie o símbolo de compilação USE_WP8_NATIVE_SQLITE no projeto "SqliteFoWP8". Preste atenção para que a configuração e a plataforma que você está criando o símbolo sejam os mesmos da execução do projeto. Este símbolo irá dizer ao pacote sqlite-net que você está usando o SQLite for Windows Phone SDK instalado anteriormente.

Possíveis problemas

Erro "Any CPU"

Se acontecer o erro mostrado na imagem abaixo com você, siga estes passos para corrigir: Clique com o botão direito na solução -> Clique em Configuration Properties -> Clique em Configuration Manager e mude a plataforma da solução ativa para x86 (Se você está usando emulador) ou ARM (Se você está usando um celular Wincows Phone 8).

Warning-message-any-cpu.png

Usando o banco de dados

Finalmente, vamos começar a fazer nossa aplicação que utiliza o banco de dados SQLite para armazenar/recuperar dados estruturados. Para manter o código simples e de fácil entendimento, tudo será implementado no arquivo MainPage.xaml.cs. Mas no mundo real, uma boa prática seria separar a camada de dados da interface com usuário, como o padrão MVVM aponta.

A classe SQLiteConnection mostrada no exemplo é parte do pacote sqlite-net. Ela possui vários métodos para controlar o banco de dados de muitas formas, mas neste exemplo vou mostrar seu uso básico. Para encontrar uma documentação completa vá para a página do projeto https://github.com/praeclarum/sqlite-net/wiki. Se você que baixar o exemplo completo e testá-lo você mesmo, clique aqui Media:SQLiteForWP8.zip.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using SqliteForWP8.Resources;
using SQLite;
using Windows.Storage;
using System.IO;
 
namespace SqliteForWP8
{
public partial class MainPage : PhoneApplicationPage
{
/// <summary>
/// The database path.
/// </summary>
private string dbPath;
 
/// <summary>
/// The sqlite connection.
/// </summary>
private SQLiteConnection dbConn;
 
// Constructor
public MainPage()
{
InitializeComponent();
/// Define the database path. The sqlite database is stored in a file.
dbPath = Path.Combine(Path.Combine(ApplicationData.Current.LocalFolder.Path, "sample.sqlite"));
}
 
protected override void OnNavigatedTo(NavigationEventArgs e)
{
/// Create the database connection.
dbConn = new SQLiteConnection(dbPath);
/// Create the table Task, if it doesn't exist.
dbConn.CreateTable<Task>();
/// Retrieve the task list from the database.
List<Task> retrievedTasks = dbConn.Table<Task>().ToList<Task>();
/// Clear the list box that will show all the tasks.
TaskListBox.Items.Clear();
foreach (var t in retrievedTasks)
{
TaskListBox.Items.Add(t);
}
}
 
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
if (dbConn != null)
{
/// Close the database connection.
dbConn.Close();
}
}
 
private void Insert_Click_1(object sender, RoutedEventArgs e)
{
// Create a new task.
Task task = new Task()
{
Title = TitleField.Text,
Text = TextField.Text,
CreationDate = DateTime.Now
};
/// Insert the new task in the Task table.
dbConn.Insert(task);
/// Retrieve the task list from the database.
List<Task> retrievedTasks = dbConn.Table<Task>().ToList<Task>();
/// Clear the list box that will show all the tasks.
TaskListBox.Items.Clear();
foreach (var t in retrievedTasks)
{
TaskListBox.Items.Add(t);
}
}
}
 
/// <summary>
/// Task class representing the Task table. Each attribute in the class become one attribute in the database.
/// </summary>
public sealed class Task
{
/// <summary>
/// You can create an integer primary key and let the SQLite control it.
/// </summary>
[PrimaryKey, AutoIncrement]
public int Id { get; set; }
 
public string Title { get; set; }
 
public string Text { get; set; }
 
public DateTime CreationDate { get; set; }
 
public override string ToString()
{
return Title + ":" + Text + " < " + CreationDate.ToShortDateString() + " " + CreationDate.ToShortTimeString();
}
}
}

Executando consultas SQL

Uma forma de executar consultas SQL na sua aplicaççao é usando a classe SQLCommand do pacote sqlite-net . O código abaixo demonstra como usar esta classe. O código de exemplo também fornece este código.

SQLiteCommand sqlCommand = new SQLiteCommand(dbConn);
sqlCommand.CommandText = "select * from task where title = 'filter_test'";
List<Task> retrievedTasks = sqlComm.ExecuteQuery<Task>();

Preparando a aplicação para ser publicada na Store

Se você não deseja publicar a aplicação na Store, a aplicação está concluída e você pode pular esta seção.

Por alguma razão, o código atual não cria o arquivo de banco de dados quando a aplicação está assinada e é baixada da Store. Este é um problema grave se você deseja publicar a aplicação na Store usando bancos de dados SQLite.

Esta seção descreve um guia passo a passo para criar o arquivo de banco de dados programaticamente em sua primeira inicialização e evitar este problema. Basicamente, o que vamos fazer é copiar o banco de dados do diretório de instalação (Que é somente leitura e pode ser alterado em tempo de desenvolvimento) para a pasta local (Que é leitura e escrita e pode ser atualizado somente em tempo de execução) somente na primeira inicialização. O exemplo do artigo já segue estes passos.

Recuperando o arquivo do banco de dados usando a ferramenta Isolated Storage Explorer

Com a aplicação em execução no celular ou no emulador, você deve usar a ferramenta Isolated Storage Explorer para baixar o arquivo de banco de dados.

Normalmente, esta ferramenta é instalada na pasta Program Files (x86)\Microsoft SDKs\Windows Phone\v8.0\Tools\IsolatedStorageExplorerTool. Vá para esta pasta e execute um dos seguintes comandos:

  • ISETool.exe ts xd 8a40681d-98fc-4069-bc13-91837a6343ca c:\data\myfiles se você está executando a aplicação no emulador.
  • ISETool.exe ts de 8a40681d-98fc-4069-bc13-91837a6343ca c:\data\myfiles se você está executando a aplicação no celular.


O terceiro argumento é o product ID da aplicação, você pode pegá-lo no arquivo 'WMAppManifest.xml, na tag App, no atributo ProductId. O product ID do exemplo do artigo é 8a40681d-98fc-4069-bc13-91837a6343ca.

Para mais detalhes sobre a ferramenta Isolated Storage Explorer, acesse aqui.

Adicione o arquivo do banco de dados como conteúdo do projeto

Neste momento, se tudo estiver correto, você deve ter uma cópia do conteúdo do Isolated Storage em c:\data\myfiles com o arquivo de banco de dados dentro desta pasta. Estou assumindo que você está executando o exemplo deste artigo, então o nome do arquivo de banco de dados é sample.sqlite. Para copiar o arquivo para seu projeto, faça o seguinte: Clique com o botão direito no projeto SqliteForWP8, clique na opção Add, clique em Add Existing Item e selecione o arquivo c:\data\myfiles\sample.sqlite e clique em Add.

Tip.pngTip: Lembre-se de mudar o parâmetro Copy to Ouput Directory do arquivo adicionado sample.sqlite para Copy if newer.

Copiar o arquivo de banco de dados na primeira inicialização

Remova o método private void Application_Launching(object sender, LaunchingEventArgs e) da classe Application e utilize o método abaixo. Esta implementação tenta encontrar o arquivo de banco de dados no Isolated Storage, se o arquivo não é encontrado, ele copia o arquivo do diretório de instalação para a pasta local.

// Code to execute when the application is launching (eg, from Start)
// This code will not execute when the application is reactivated
private async void Application_Launching(object sender, LaunchingEventArgs e)
{
StorageFile dbFile = null;
try
{
// Try to get the
dbFile = await StorageFile.GetFileFromPathAsync(MainPage.DB_PATH);
}
catch (FileNotFoundException)
{
if (dbFile == null)
{
// Copy file from installation folder to local folder.
// Obtain the virtual store for the application.
IsolatedStorageFile iso = IsolatedStorageFile.GetUserStoreForApplication();
 
// Create a stream for the file in the installation folder.
using (Stream input = Application.GetResourceStream(new Uri("sample.sqlite", UriKind.Relative)).Stream)
{
// Create a stream for the new file in the local folder.
using (IsolatedStorageFileStream output = iso.CreateFile(MainPage.DB_PATH))
{
// Initialize the buffer.
byte[] readBuffer = new byte[4096];
int bytesRead = -1;
 
// Copy the file from the installation folder to the local folder.
while ((bytesRead = input.Read(readBuffer, 0, readBuffer.Length)) > 0)
{
output.Write(readBuffer, 0, bytesRead);
}
}
}
}
}
}

Referências

This page was last modified on 15 March 2014, at 16:57.
299 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×