×
Namespaces

Variants
Actions
Revision as of 02:31, 28 July 2013 by lpvalente (Talk | contribs)

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 lpvalente em 28 Jul 2013

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.

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.

Extensions-and-update-window-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.

Extensions-and-update-window-2.png

Instalando o wrapper sqlite-net-wp8

Este wrapper é a ponte C++ entre o SDK SQLite for Windows Phone SDK e o pacote NuGet sqlite-net que iremos instalar em breve. Primeiro, você precisa baixar o seguinte repositório Git "https://github.com/peterhuene/sqlite-net-wp8.git". Neste ponto, assumo que você use e conheça o básico de Git. Se este não é o caso, por favor vá para (https://code.google.com/p/tortoisegit/) e instale o Git tortoise. Ele é fácil de usar e integrado com o Windows.

Agora, adicione este projeto "sqlite-net-wp8" na solução 'SqliteForWP8' criada inicialmente: Clique com botão direito na solução (Não no projeto) -> Clique em Add -> Clique em Existing Project e selecion o arquivo Sqlite.vcxproj da pasta que você baixou usando o Git. Isto irá criar o projeto 'Sqlite' na sua solução. Agora você precisa adicionar a referência para este projeto no seu projeto "SqliteForWP8": Clique com o botão direito na pasta References do projeto "SqliteForWP8" (Não na solução) -> Clique em Add Reference -> Clique em Solution e selecion o projeto "Sqlite" -> Clique no botão OK.

Se você executou tudo corretamente, neste ponto você deve ter uma solução "SqliteForWP8" com dois projetos dentro: O projeto C++ "Sqlite" e o projeto C# "SqliteForWP8".

Instalando o pacote sqlite-net

O pacote sqlite-net provê as classes C# que você utiliza 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" -> Quando encontrar o pacote, clique no botão Install. No momento da escrita deste artigo a versão mais recente é a 1.0.7 e foi criado por "Frank Krueger". Use a imagem abaixo como referência para te guiar na instalação do pacote correto.

Adding-sqlite-for-wp8-support.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();
}
}
}

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

327 page views in the last 30 days.
×