Base De Données Phonegap Hors Ligne

je veux stocker quelques grand données hors ligne dans le téléphone de l'utilisateur (plus de 100 Mo) dans une base de données cryptée . Si possible, je veux aussi distribuer la base de données pré-remplie. J'ai aussi vu ce .

je sais À propos de la webdatabase chose, mais parce qu'il est amorti , je suis conseillé de ne pas travailler avec cela.

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

y a-t-il une autre solution que d'écrire la mienne?

33
demandé sur noway 2012-08-17 15:38:18

5 réponses

j'ai fait une application récemment qui a exigé ceci, ciblant le même OS. Vous pouvez utiliser une combinaison de 2 bases de données:

1. LocalStorage::

contrôle de stockage local

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

placer un article dans le stockage local

localStorage.setItem("bar", foo);

ou

localStorage["bar"] = foo;

obtenir un article de LocalStorage

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

ou

var foo = localStorage["bar"];

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

configurer votre DB

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éez 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 appeler une classe de plugin natif sur tous les appareils en utilisant L'appel de plugin Phonegap. Pendant l'appel, vous pouvez passer des paramètres à la classe, et la classe native peut stocker vos données dans L'OS lui-même.

par exemple :: dans iOS, vous créez un plugin .h. & classe m et l'enregistrer avec le Cordova.dossier plist. Une fois que C'est fait, vous devez envoyer un appel à la classe à partir de JavaScript en utilisant Phonegap. Une fois que les paramètres ont été reçus en utilisant NSDictionary ou tout autre type de NSArray, vous pouvez appeler une classe CoreData 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 manière pour tous les autres OS également:)

Pour le Chiffrement essayez ce qui suit: SQLCipher

voici quelques informations supplémentaires sur le travail avec une base de données SQLite existante. Dans cet exemple chiffré.db est la toute 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;
34
répondu SashaZd 2013-04-04 16:55:37

dans la spécification W3C pour webdatabase il est mentionné que le groupe de travail sur les Applications Web poursuit ses travaux sur deux autres spécifications liées au stockage: Web Storage et Indexed Database API .

ainsi la spécification webdatabase n'est plus active, mais les deux autres spécifications sont actives.

le stockage Web peut être utilisé pour stocker des données localement dans le navigateur de l'utilisateur. Il y a les objectifs suivants pour y parvenir:

  • stockage local qui stocke des données sans date d'expiration
  • sessionStorage qui stocke les données d'une session

le stockage Web n'est pas recommandé pour votre cas (plus de 100 Mo), parce que la spécification W3C mentionne que:

une limite arbitraire de cinq mégaoctets par origine est recommandé.

à mon avis, SQLite est la meilleure option disponible puisqu'il s'agit d'une bibliothèque en cours de réalisation qui implémente un moteur de base de données SQL autonome, sans serveur, à configuration zéro. De plus, les SQLite limits semblent couvrir vos besoins:

le plus grand paramètre possible pour SQLITE_MAX_PAGE_COUNT est 2147483646. Lorsqu'il est utilisé avec la taille de page maximale de 65536, cela donne taille maximale de la base de données SQLite d'environ 140 téraoctets.

en ce qui concerne vos exigences de cryptage, vous devriez considérer le SQLCipher qui est une extension SQLite.

SQLCipher est une extension SQLite qui fournit un cryptage AES transparent de 256 bits des fichiers de base de données. À ce jour, Zetetic LLC en a fait la promotion et la mise à jour. Dans L'espace mobile, SQLCipher a apprécié utilisation répandue dans les iOS D'Apple, ainsi que Nokia / QT pendant un certain temps.

une option alternative consiste à 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 cela aidera.

4
répondu Tolis Emmanouilidis 2012-08-24 16:26:20

l'application mobile sur laquelle je travaille a une exigence similaire. Il nécessite un accès hors ligne à un tableau qui contient près de 500 000 pièces différentes. La source de cette table est extraite du serveur en obtenant son JSON via une URL GET bien définie.

j'ai considéré DB indexé mais les navigateurs mobiles à l'intérieur d'iOS et Android ne supportent pas cela. Le stockage Web local n'est pas une option en raison de sa limite de 5 Mo. Donc, j'ai décidé d'utiliser le web SQL Standard de base de données ( ) http://www.w3.org/TR/webdatabase / ) même si elle est dépréciée. Mon expérience jusqu'à présent avec L'utilisation de la base de données Web SQL a été très bonne. Les opérations de base de données fonctionnent très bien et sont très fiables sur les appareils mobiles que je supporte (iPad 2, iPad 3, Motorola Xyboard, Samsung Galaxy Tab 2). De plus, Phonegap expose une API JavaScript à travailler 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 les données JSON téléchargées dans une base de données SQLite dont les fichiers sont empaquetés dans le cadre de L'apk Android ou le paquet d'application iOS.

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

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. Faites-moi savoir si vous avez des questions sur ma mise en œuvre particulière.

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

1
répondu jkwuc89 2013-04-08 18:15:05

j'ai essayé d'utiliser LokiJS comme une base de données locale, et l'ai trouvé utile dans les données non relationnelles. Dans mon cas, je récupère des données stockées en utilisant MongoDB sur le serveur, mais cela dépend de la nature de votre système

1
répondu ahmed wahba 2017-10-25 11:12:10