Last week we sorted out the UI/UX (http://www.clefsoftware.com/blog/bioiq-ux-ultrabook). This week we worked on settling on an approach for local storage.
At the outset, our preference was to use SQLite. These features make it a good choice for our context. We have used it before, are familiar with it and we like it. We weren’t able to get it to work in our first attempt. We dug around and asked some friends. The official word is that SQLite added support for Windows 8 (http://www.sqlite.org/news.html) and relevant JavaScript library is also available. To take advantage of these, we spent some more time trying to get it going. That was not to be since we are stuck with a “0x800401f9 - JavaScript runtime error: Error in the DLL“
In case someone wants to give it a shot , here are some detailed notes. At a high level, its straight forward–
(1) Find and install SQLite3 plug-in from Visual-Studio store
(2) Download JS library and add to the project
Copy SQLite3 (downloaded as part of JS library) to VisualStudio project work-space
Added SQLite3 reference to the project ( right click on the Solution > Add > Add reference and add)
(3) Enable Windows VC++ run-time package and SQLite3 for WRT thru ‘Add reference’ option.
(4) Add SQLite3.js library to the project.
We would have liked to dig in a bit and solve this (we will tell you our motivation for this in a future post). Now, we do want to keep the show on the road so we decided to come up with alternate options.
This MSDN article, summarizing different options available for app-data storage is a good starting point.
We considered IndexedDB and played around a bit with it. IndexedDB has an ‘experimental technology’ tag on it and given that Win 8, itself is new, we decided to go with go with the recommended Local Storage option. Let us know if you have SQLite working and/or if you would have chosen IndexedDB instead of the local store approach. Meanwhile, below are some code snippets from our current implementation around the local storage.
The code below shows the data-initialization for BioIQ Game. Making use of “Windows.Storage.ApplicationData” (class providing access to application’s data-store) and ApplicationData.LocalSettings ( Gets the application settings container in the local app data store).
----------------------
/* ******************
Windows.Storage.ApplicationData & ApplicationData.LocalSettings object reference created in default.js
********** */
var applicationData = Windows.Storage.ApplicationData.current;
var localSettings = applicationData.localSettings;
/* *******************************
Game-master data initiated in index.htm. ( work in-progress code)
********************************* */
function createGameLevelData(filename, gamename, gaame_package, purchased, purchaseddate, label_count, start_time, end_time, attempts, labels_answered, all_labels_ok)
{
var composite = new Windows.Storage.ApplicationDataCompositeValue();
if (!localSettings.values[gamename]) {
composite['filename'] = filename;
composite['gamename'] = gamename;
composite['package'] = game_package;
composite['purchased'] = purchased;
localSettings.values[gamename] = composite;
}
composite = localSettings.values[gamename];
}
// *************** end of game-data initialization function
The code below showing the selection of default game to be played (using Applicaton local data).
/* ******************
Function to determine which game to play next. Makes use of user-history (game-play), game-purchase status details.
*********************** */
function loadDefaultGame() {
var currentgame;
var gamedata = new Windows.Storage.ApplicationDataCompositeValue();
//On game-launch, check the current game to be played from Local-app-data-storage
if (!localSettings.values["CurrentGameDetails"])
{
gamedata["gamename"] = "plantcell";
localSettings.values["CurrentGameDetails"] = gamedata;
}
// Get the nextgame to be played based on previously played game
gameData = localSettings.values["CurrentGameDetails"];
currentGame = gameData["gamename"];
var gamePurchasedState = localSettings.values[currentGame];
if (gamePurchasedState["purchased"] == 0)
{
$("#BioIQ_BuyNewGames").show();
}
else {
//load the corresponding game
location.href = currentGame + ".html";
}
}
----------------------
In summary - to avoid being blocked, we have proceeded with the MS recommended local storage approach. It will work fine for our current release. Sometime in the future we do expect to revisit this choice.

Add new comment