33 votes

Base de données hors connexion Phonegap

Je veux stocker quelques grandes données en mode hors connexion de l'utilisateur téléphone (plus de 100 MO) dans un chiffré de la base de données. Si possible, je tiens également à distribuer la base de données pré-remplies. J'ai aussi vu de ce.

Je sais que sur le webdatabase chose, mais parce qu'il est amorti, je suis conseillé de ne pas travailler avec ça.

J'ai aussi vu certains de ses plugins tiers tels que SQLite Plugin, mais il ne fonctionne que pour les appareils iOS et Android, mais je cible 4 plates-formes (ios, android, blackberry, windows)

Est-il un autre solution, autre que d'écrire mon propre?

34voto

SashaZd Points 1879

J'ai fait une application récemment que nécessaire ce, viser le même OS. Vous pouvez utiliser une combinaison de 2 bases de données :

1. LocalStorage ::

Vérifier localStorage

function supports_html5_storage() {
  try {
    return 'localStorage' in window && window['localStorage'] !== null;
  } catch (e) {
    return false;
  }
}

Définir un élément dans LocalStorage

localStorage.setItem("bar", foo);

ou

localStorage["bar"] = foo;

Obtenir un élément de LocalStorage

var foo = localStorage.getItem("bar");

ou

var foo = localStorage["bar"];

2. La Base de données SQLite (plus pratique, plus persistive)

Configurer votre base de données

var shortName = 'BHCAppDB'; 
var version = '1.0'; 
var displayName = 'BHCAppDB'; 
var maxSize = 65535; 
if (!window.openDatabase){ 
     alert('!! Databases are not supported in this Device !! \n\n We are sorry for the inconvenience and are currently working on a version that will work on your phone'); 
}
db = openDatabase(shortName, version, displayName,maxSize);
createAllTables(db);

Créer vos Tables

function createAllTables(db){
    db.transaction(function(transaction){
        transaction.executeSql("CREATE TABLE IF NOT EXISTS Profile(id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT, gender TEXT,age INTEGER)");
}

Exécuter une Requête SQL

transaction(function(transaction){
        var rowCount = 'SELECT * FROM Profile';
        transaction.executeSql(rowCount,[],function(transaction,result){
            if(result.rows.length == 0){
                var sqlString = 'INSERT INTO Profile (name,gender,age) VALUES("自己","Female",18)';
                transaction.executeSql(sqlString);

            }
        });
    });

EDIT :: j'ai oublié d'ajouter dans la dernière option :)

3. Stockage natif sur tous les appareils

C'est la meilleure partie de Phonegap. Vous pouvez faire appel à un natif classe de plugin sur tous les appareils utilisant le plugin Phonegap appel. Pendant l'appel, vous pouvez passer des paramètres à la classe, et la classe native pouvez stocker vos données dans le système d'exploitation lui-même.

Par exemple : dans iOS, vous devez créer un plugin .h & .m classe et l'enregistrer avec le Cordova.fichier plist. Une fois cela fait, vous avez besoin d'envoyer un appel à la classe à partir de JavaScript à l'aide de Phonegap. Une fois que les paramètres ont été reçues à l'aide de NSDictionary ou de tout autre NSArray type, vous pouvez faire appel à un CoreData classe pour stocker des quantités ILLIMITÉES de données. Vous ne serez jamais à court de mémoire .

Cela peut être fait de la même façon pour tout le reste de l'OS, aussi :)

Pour le Chiffrement, essayez les opérations suivantes :: SQLCipher

Voici quelques informations supplémentaires sur la façon de travailler avec une base de données SQLite. Dans cet exemple chiffré.db, c'est que la marque nouvelle base de données que vous créez et pragma.

ATTACH DATABASE 'encrypted.db' AS encrypted KEY 'secret'; -- create a new encrypted database
CREATE TABLE encrypted.t1(a,b); -- recreate the schema in the new database (you can inspect all objects using SELECT * FROM sqlite_master)
INSERT INTO encrypted.t1 SELECT * FROM t1; -- copy data from the existing tables to the new tables in the encrypted database
DETACH DATABASE encrypted;

4voto

Dans la spécification du W3C pour webdatabase il est mentionné que les Applications Web du Groupe de Travail continue de travailler sur deux autres liées au stockage spécifications: Web de Stockage et de Base de données Indexée API.

Ainsi, le webdatabase spécification n'est plus actif, mais les deux autres spécifications sont actifs.

Le Web de Stockage peut être utilisé pour stocker des données localement dans le navigateur de l'utilisateur. Il y a les objets suivants à réaliser que:

  • localStorage qui stocke les données sans date d'expiration
  • sessionStorage qui stocke les données d'une session

Le Stockage sur le Web n'est pas recommandé pour votre cas (plus de 100 MO), parce que la spécification du W3C mentionne que:

Un la plupart du temps limite arbitraire de cinq mégaoctets par l'origine est recommandée.

À mon avis, SQLite est la meilleure option, car elle est une bibliothèque de processus qui met en œuvre une auto-contenue, sans serveur, sans aucune configuration, transactionnelle SQL moteur de base de données. En outre, le SQLite limites semble couvrir vos besoins:

La plus grande possible pour SQLITE_MAX_PAGE_COUNT est 2147483646. Lorsqu'il est utilisé avec la taille maximale de la page de 65536, ce qui donne un maximum de base de données SQLite taille d'environ 140 téraoctets.

Concernant vos conditions de chiffrement, vous devez considérer les SQLCipher qui est une extension SQLite.

SQLCipher est une extension SQLite qui fournit transparent AES 256 bits de cryptage de fichiers de base de données. À ce jour, il a été "open source", parrainé et maintenu par Zététitien LLC. Dans l'espace mobile, SQLCipher a bénéficié de l'utilisation très répandue dans l'iOS d'Apple, ainsi que Nokia / QT pour assez un certain temps.

Une autre option est de chiffrer et déchiffrer vos données lors de l'écriture et de la lecture de votre base de données.

J'espère que cette aide.

1voto

jkwuc89 Points 495

L'application mobile sur lequel je travaille une exigence similaire. Il nécessite un accès hors ligne à un tableau qui contient près de 500 000 pièces différentes en elle. La source de ce tableau est extrait à partir du serveur en obtenant sa JSON via un GET de l'URL.

J'ai considéré Indexé DB, mais les navigateurs mobiles à l'intérieur d'iOS et d'Android ne prennent pas en charge cette. Web local de stockage n'est pas une option en raison de son dur de 5 MO. Donc, j'ai décidé d'utiliser le Web, Base de données SQL standard (http://www.w3.org/TR/webdatabase/), même si sa obsolète. Mon expérience jusqu'à présent avec l'aide de Web de Base de données SQL a été très bonne. Opérations de base de données fonctionnent très bien et sont très fiables sur les appareils mobiles que j'support (iPad 2, iPad 3, Motorola Xyboard, Samsung Galaxy Tab 2). De Plus, Phonegap expose une API JavaScript pour fonctionner avec cette norme (voir http://docs.phonegap.com/en/2.5.0/cordova_storage_storage.md.html#Storage).

J'ai écrit un utilitaire Java qui convertit le téléchargement des données JSON dans une base de données SQLite dont les fichiers sont emballés dans le cadre de l'Android APK ou l'application iOS paquet.

Quand mon Phonegap application mobile démarre, il utilise le code natif pour vérifier l'application du privé répertoire de données pour la présence de la base de données SQLite fichiers. Si les fichiers ne sont pas présents, le code natif copie les fichiers de base de données à partir du package de l'application.

Mon application est basée sur l'exemple de code que j'ai trouvé sur le lien ci-dessous. J'espère que cette aide. Laissez-moi savoir si vous avez des questions au sujet de mon particulier la mise en œuvre.

http://gauravstomar.blogspot.com/2011/08/prepopulate-sqlite-in-phonegap.html

0voto

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X