Aplicativos Modernos

Opções de acesso a dados e armazenamento em aplicativos da Windows Store

Rachel Appel

 

Rachel AppelO gerenciamento de dados é uma parte fundamental do desenvolvimento de aplicativos. Seja um aplicativo de jogos, notícias, viagens ou moda, tudo gira sempre em torno dos dados. Os aplicativos modernos muitas vezes precisam gerenciar dados dispersos em vários locais diferentes e em inúmeros formatos. Falarei sobre as várias opções de armazenamento de dados e APIs de acesso a dados disponíveis para a criação de aplicativos da Windows Store, em todas as linguagens, bem como estratégias de gerenciamento de dados de conteúdo e configuração.

Considerações sobre gerenciamento e armazenamento de dados

Como desenvolvedor de aplicativos, você precisa determinar os requisitos de dados do aplicativo antes de iniciar seu projeto, pois mudar a arquitetura subjacente causa uma série de retrabalhos. Você pode ter uma fonte de dados existente, caso em que a decisão é tomada por você, mas com um projeto de ambiente intacto, você deve pensar em onde armazenar os dados. As duas opções são no dispositivo ou em um local remoto:

  • Local: geralmente, esses dados estão em um arquivo ou banco de dados local, mas no Windows 8, você pode tratar outros aplicativos como fontes de dados usando o seletor de arquivo interno ou contratos. Em aplicativos JavaScript, o Armazenamento na Web e a API IndexedDB também estão disponíveis como fontes de dados locais.  
  • Remoto: esses dados poderiam estar na nuvem usando o Windows Azure SkyDrive ou qualquer ponto de extremidade HTTP remoto que pode fornecer dados JSON ou XML, incluindo APIs públicas, como Facebook e Flickr.

O tamanho dos dados geralmente determina se os dados são locais ou remotos; no entanto, os aplicativos mais modernos usarão dados de ambas as fontes. Isso é porque dispositivos menores e mais móveis, como slates, tablets e celulares são a norma, e eles geralmente não têm muito espaço de armazenamento. Apesar disso, eles ainda precisam que os dados funcionem corretamente quando offline. Por exemplo, o Surface, assim como muitos dispositivos portáteis, vem em modelos de 32 GB e 64 GB. Dados baseados em texto simples como JSON não são geralmente grandes, mas bancos de dados relacionais e dados de mídia (como imagens, áudio e vídeo) podem encher um dispositivo rapidamente.

Vejamos as várias opções locais e remotas para armazenar dados de conteúdo do aplicativo.

Armazenamento na Web

Pode parecer que o Armazenamento na Web (bit.ly/lml0Ul) é simplesmente armazenamento na Web, mas não é. O Armazenamento na Web, um padrão HTML5, é uma ótima maneira de manter dados de aplicativos no cliente, localmente. Aplicativos da Windows Store e páginas HTML simples antigas oferecem suporte ao Armazenamento na Web. Nenhuma configuração de banco de dados é necessária e não há arquivos para copiar, pois o Armazenamento na Web é um banco de dados na memória.

O Armazenamento na Web é acessível via JavaScript por uma das duas propriedades do objeto window a seguir:

  1. localStorage: dados locais persistentes depois que o aplicativo é encerrado e disponíveis para futuras instâncias de aplicativos.
  2. sessionStorage: também dados locais; no entanto, sessionStorage é destruído quando a execução de um aplicativo da Windows Store é encerrada.

Você pode armazenar dados de tipos simples a objetos complexos no Armazenamento na Web anexando propriedades dinâmicas às variáveis sessionStorage ou localStorage. As propriedades dinâmicas são um par de chave/valor com sintaxe semelhante a esta:

sessionStorage.lastPage = 5;
WinJS.xhr({ url: "data/data.json" }).then(function (xhr) {
  localStorage.data = xhr.responseText;
};

A propriedade lastPage existe até o aplicativo ser encerrado porque faz parte de sessionStorage, enquanto a propriedade data de localStorage persiste após o tempo de duração do aplicativo.

Ser capaz de manter os dados localmente entre sessões de aplicativos torna o Armazenamento na Web uma excelente opção para oferecer suporte a cenários offline. Dados pequenos também são mais adequados para o suporte offline. Como dados JSON são compactos, é fácil preencher conjuntos de dados JSON inteiros no espaço de 5 MB fornecido pelo Armazenamento na Web e ter muito espaço de sobra para alguns dados de mídia.

Como o Armazenamento na Web é um padrão HTML5, ele está disponível somente em projetos da Windows Store criados com JavaScript.

IndexedDB

Outro padrão da família HTML5 é o IndexedDB (bit.ly/TT3btM), que é um repositório de dados local para conjuntos de dados grandes, pesquisáveis e persistentes. Como componente do HTML5, você pode usar o IndexedDB no aplicativos Web cliente para navegadores, bem como aplicativos da Windows Store. O IndexedDB armazena itens em um banco de dados de objeto e é extremamente flexível, pois você pode armazenar qualquer tipo de dados, de texto a BLOBs. Por exemplo, arquivos multimídia tendem a ser muito grandes; então, armazenar áudio e vídeo em IndexedDB é uma boa opção.

Como o IndexedDB é um banco de dados de objeto, ele não usa instruções SQL; então, você deve acessar os dados usando uma sintaxe de estilo orientado por objeto. A interação com um repositório de dados IndexedDB ocorre por meio de transações e cursores, conforme mostrado aqui:

var dataStore = "Datastore";
var trn = db.transaction(dataStore, IDBTransaction.READ_ONLY);
var store = trn.objectStore(dataStore);
trans.oncomplete = function(evt) { // transaction complete };
var request = store.openCursor();
request.onsuccess = function(evt) {
  var cursor = evt.openCursor();
};
request.onerror = function(error) { // error handling };

Como o IndexedDB é especializado em dados muito grandes, usá-lo para armazenar itens pequenos faz com que ele se comporte de forma ineficiente, tornando o Armazenamento na Web uma opção muito melhor para dados locais com bites (ou bytes) de tamanho. O IndexedDB também combina bem com dados de conteúdo, mas não é adequado para dados de configuração de aplicativos.

SQLite

SQLite (bit.ly/65FUBZ) é um banco de dados autônomo transacional, relacional e baseado em arquivo, que não requer configuração e não precisa de um administrador de banco de dados para mantê-lo. Você pode usar o SQLite com qualquer linguagem do Tempo de Execução do Windows (WinRT), e está disponível como uma extensão do Visual Studio. Embora o SQLite funcione bem em aplicativos JavaScript, é preciso obter o wrapper SQLite3 WinRT (bit.ly/J4zzPN) do GitHub antes de usá-lo.

Desenvolvedores com experiência em ASP.NET ou Windows Forms gravitam para bancos de dados relacionais, mas um sistema de gerenciamento de bancos de dados relacionais (RDBMS) nem sempre é a melhor opção para escrever aplicativos modernos, devido a problemas de espaço em dispositivos móveis, bem como aos variados tipos e formatos de dados, especialmente multimídia. Como o SQLite é um banco de dados relacional, é coerente usá-lo com aplicativos que precisam de comportamentos relacionais e transacionais. Isso significa que o SQLite é ótimo para aplicativos LOB ou de entrada de dados, e também pode ser um repositório de dados locais off-line originalmente obtidos de uma fonte online.

Se o banco de dados SQLite ficar muito grande para dispositivos portáteis, você poderá movê-lo para um local no servidor ou na nuvem. O código não mudará muito, pois a biblioteca do SQLite3 usa uma conexão tradicional e objetos Create/Read/Update/Delete (CRUD) semelhantes ao seguinte código:

// C# code that opens an async connection.
var path =
  Windows.Storage.ApplicationData.Current.LocalFolder.Path + @"\data.db";
var db = new SQLiteAsyncConnection(path);
// JavaScript code that opens an async connection.
var dbPath =
  Windows.Storage.ApplicationData.current.localFolder.path + '\\data.db;
SQLite3JS.openAsync(dbPath).then(function (db) {
  // Code to process data.
});

Como você pode ver, usar o SQLite é como usar outros bancos de dados SQL. Os limites para bancos de dados SQLite chegam até 140 TB. Tenha em mente que dados muito grandes geralmente garantem a administração profissional de bancos de dados para a melhor integridade de dados possível, desempenho e segurança. A maioria dos DBAs e desenvolvedores que trabalham com bancos de dados relacionais preferem uma ferramenta GUI para criar e gerenciar objetos de banco de dados ou executar consultas ad hoc de dados, e o utilitário de administração Sqliteman (bit.ly/9LrB1o) é ideal para todas as operações básicas do SQLite.

Se você estiver portando aplicativos de desktop para Windows existentes escritos nas linguagens Windows Forms, Windows Presentation Foundation (WPF) ou Silverlight, talvez já esteja usando o SQL Server Compact (SQL CE). Se for esse o caso, você pode migrar bancos de dados SQL CE para o SQLite com o utilitário ExportSqlCE (bit.ly/dwVaR3) e usar o Sqliteman para administrá-los.

Arquivos como dados e a API de arquivo

Por que se preocupar com um banco de dados, especialmente se os usuários do seu aplicativo querem ficar com os arquivos que já têm? Isso é especialmente válido para fotos e documentos. A API de arquivo vai além da simples oferta de um navegador para diretórios e arquivos; ela dá ao usuário a capacidade de escolher um aplicativo como local de arquivo. Isso significa que os aplicativos podem se comunicar entre si e trocar dados. Um seletor de arquivo aberto pode interagir com o Bing, câmeras ou aplicativos de fotos, bem como diretórios comuns e locais nomeados como Meus Documentos, Vídeos ou Músicas. Compartilhar dados tão facilmente entre aplicativos, serviços e arquivos pessoais é um excelente recurso do Windows.

Muitos sistemas operacionais têm um mecanismo para registrar tipos de arquivos que os aplicativos pretendem usar juntamente com a capacidade de iniciar esses aplicativos quando o usuário interage com um ícone no sistema operacional. No Windows, isso é chamado de associação de arquivo. O Windows 8 leva esse conceito ainda mais longe, permitindo que os aplicativos se comuniquem entre si por meio de um recurso do sistema chamado Contratos. Uma maneira de implementar um contrato é através de um seletor de arquivos. Observe que o código a seguir é semelhante para as APIs de diálogo de arquivo de aplicativos de desktop ou de versões anteriores do Windows (observação: parte do código foi deixada de fora neste exemplo para simplificar; para uma análise mais aprofundada da classe FileOpenPicker, consulte bit.ly/UztmDv):

fileOpen: function () {
  var openPicker = new Windows.Storage.Pickers.FileOpenPicker();
  openPicker.viewMode = Windows.Storage.Pickers.PickerViewMode.thumbnail;
  openPicker.suggestedStartLocation =
    Windows.Storage.Pickers.PickerLocationId.picturesLibrary;
  openPicker.fileTypeFilter.replaceAll([".png", ".jpg", ".jpeg"]);
  openPicker.pickSingleFileAsync().done(function (file) {
  // ...
  });
}

Escolher um aplicativo em um seletor do Windows 8 inicia esse aplicativo. Por exemplo, se o usuário seleciona o Bing, o seletor irá iniciar o aplicativo Bing e retornará a seleção de imagem do usuário para seu aplicativo.

Agora que você já viu as opções locais, vejamos as opções para dados remotos.

Serviços Web e a API Web ASP.NET

A maioria dos desenvolvedores está familiarizada com o consumo e a modificação de dados com serviços Web XML porque se remetem aos tempos do Microsoft .NET Framework 1.x. A principal vantagem do uso de serviços Web é que os dados "moram" em um local remoto central e os aplicativos de vários dispositivos podem acessar os dados a qualquer momento enquanto estiverem conectados. O acesso ao banco de dados subjacente é canalizado por um conjunto de pontos de extremidade HTTP que troca dados JSON ou XML. Muitas APIs públicas, como Twitter ou Flickr, expõem dados JSON ou XML que você pode consumir em aplicativos da Windows Store.

Os serviços Web vêm em vários formatos:

  • Serviços ASMX: usam o ASP.NET tradicional para fornecer dados por HTTP.
  • Serviços Windows Communication Foundation (WCF) e Rich Internet Application (RIA): uma forma baseada em mensagens para enviar dados entre pontos de extremidade HTTP.
  • OData: protocolo de dados abertos, outra API para transportar dados por HTTP.
  • API Web ASP.NET: nova estrutura do ASP.NET MVC 4 que facilita a criação de serviços HTTP RESTful que fornecem dados JSON ou XML para aplicativos ou sites.

Se você for criar serviços de back-end do zero, a API Web ASP.NET simplifica o processo de desenvolvimento porque facilita a criação de serviços na forma RESTFul consistente, para que possam ser facilmente consumidos por aplicativos. 

Independentemente do serviço de back-end, se for por HTTP, você pode usar os objetos HttpWebRequest e HttpWebResponse para se comunicar com um serviço Web via C#. Em aplicativos JavaScript, um wrapper WinJS XMLHttpRequest é incluído para operações assíncronas, que se parece com o seguinte código:

WinJS.xhr({ url: "data.json" }).then(function (xhr) {
  var items = JSON.parse(xhr.responseText);
  items.forEach(function (item) {
    list.push(item);
  })
});

O espaço de armazenamento não é normalmente um problema com serviços Web porque um serviço Web é apenas o software que transporta os dados entre os pontos de extremidade. Isso significa que seu banco de dados subjacente pode morar em qualquer lugar, como em um servidor remoto, host Web ou instância do Windows Azure.

Você pode hospedar qualquer um dos serviços Web mencionados anteriormente, como uma instância da API Web ASP.NET ou um serviço WCF no Windows Azure, juntamente com os dados propriamente ditos.

SkyDrive

Não se esqueça de que o SkyDrive (bit.ly/HYB7iw) não é apenas uma opção de armazenamento de dados, mas uma excelente opção. Pense no SkyDrive como uma opção de armazenamento sem armazenamento. Os usuários podem escolher o SkyDrive como um local na nuvem e acessar documentos usando os seletores Abrir ou Salvar Arquivo. Permitir que os usuários salvem arquivos no SkyDrive significa zero preocupação sobre o gerenciamento de bancos de dados, e com 7 GB de espaço por usuário, há muito espaço. Os usuários do SkyDrive também podem comprar mais espaço de armazenamento.

A API do Live (bit.ly/mPNb03) contém um conjunto de recursos completo de APIs RESTful SkyDrive para leitura e gravação no SkyDrive. Uma chamada para o SkyDrive para recuperar a lista de itens compartilhados se parece com esta:

GET https://apis.live.netv5.0/me/skydrive/shared?access_token=ACCESS_TOKEN

Um namespace Microsoft.Live permite que os desenvolvedores de C# acessem as APIs do Live e do SkyDrive, enquanto os desenvolvedores de JavaScript podem fazer chamadas RESTful com os verbos HTTP POST ou PUT. O SkyDrive não é recomendado para dados de configuração de aplicativos.

Serviços móveis do Windows Azure

Os serviços móveis do Windows Azure é uma ótima opção para aqueles que criam aplicativos entre e para várias plataformas. Baseados no Windows Azure, eles oferecem mais que um simples armazenamento escalonável; oferece notificações por push, gerenciamento de lógica de negócios, uma API de autenticação e um SDK completo. Além desses recursos, uma ferramenta administrativa baseada na Web e fácil de usar é fornecida. 

O SDK de serviços móveis integra-se com aplicativos da Windows Store, Windows Phone 8, iOS e Android. Há suporte para todas as plataformas principais, e com o SDK de serviços móveis, você pode criar um protótipo de funcionamento em minutos e ficar a poucos passos de fornecer dados para aplicativos de várias plataformas rapidamente.

Entre os muitos itens do SDK, você pode usar o objeto query para consultar dados de tabelas, como este:

var query = table.orderBy('column').read({ success: function(results) { ... }});

Como você pode ver, o código é igual ao de que qualquer outra API; então, a curva de aprendizado é a mesmo das outras opções abordadas aqui. Você pode acessar o SDK e os serviços móveis usando qualquer linguagem de aplicativo da Windows Store.

Opções de gerenciamento e armazenamento de dados de aplicativos

Todas as opções de armazenamento e acesso de dados mencionadas anteriormente são para armazenar conteúdo, mas como desenvolvedor, você também precisa lidar com os dados de configuração do aplicativo. Esses são os metadados que descrevem seu aplicativo ou os recursos de seu dispositivo, não os dados do usuário. Os aplicativos modernos usam dados de aplicativos persistentes (como as preferências do usuário) e metadados temporários (como a última posição de rolagem ou tendências de termos de pesquisa do usuário). Essas conveniências pequenas, porém eficazes, garantem a melhor experiência para o usuário; por isso é importante para criá-las em seu aplicativo.

Embora alguns desses dados pertençam ao dispositivo, considere o fato de que muitos aplicativos funcionam em várias plataformas e dispositivos; portanto, centralizar e sincronizar dados de aplicativos do Windows Azure com os dados de conteúdo geralmente faz sentido.

Existe um conjunto específico de APIs para gerenciar dados de aplicativos em uma classe chamada ApplicationData no namespace Windows.Storage, e o código é semelhante a este:

var localSettings = Windows.Storage.ApplicationData.current.localSettings;
var roamingSettings = Windows.Storage.ApplicationData.current.roamingSettings;

Você pode armazenar objetos simples ou complexos nas propriedades localSettings ou roamingSettings.

Usar configurações locais ou móveis é a maneira preferencial de trabalhar com dados de configuração. Tecnologias como IndexedDB, arquivos ou SkyDrive normalmente não são opções boas para dados de configuração de aplicativos, e o SQLite faz sentido aqui somente se o aplicativo já estiver usando-o para armazenar o conteúdo. Você também deve considerar o que fazer quando o aplicativo estiver offline ou desconectado da Internet. Em outras palavras, alguns dos seus dados devem ser armazenados em cache, mas sem consumir muito espaço em disco.

Conteúdo e configuração

Em resumo, para implementar uma arquitetura de dados apropriada, você não deve depender do espaço limitado em dispositivos portáteis e, portanto, hospedar dados na nuvem é geralmente uma boa pedida. Mas, se você tiver um banco de dados existente, reutilizá-lo pode ser uma necessidade. Os aplicativos da Windows Store oferecem suporte a uma variedade de necessidades de armazenamento estruturado e em BLOB para conteúdo e configuração.

Se você for criar um aplicativo para a Windows Store e precisar ajuda para escolher uma estratégia de acesso a dados, recomendo que você confira o programa Generation App (bit.ly/W8GenAppDev). O Generation App orienta você ao longo do processo de criação de um aplicativo para a Windows Store (ou Windows Phone) em 30 dias oferecendo consultoria e assistência técnica e de design gratuitamente, além de dicas e recursos exclusivos.

Rachel Appel é desenvolvedora e divulgadora da Microsoft na cidade de Nova York. Entre em contato com ela por meio do site rachelappel.com ou pelo email rachel.appel@microsoft.com. Você também pode segui-la no Twitter em twitter.com/rachelappel.

Agradecemos aos seguintes especialistas técnicos pela revisão deste artigo: Scott Klein e Miriam Wallace