web-dev-qa-db-fra.com

Base de données hors ligne Phonegap

Je souhaite stocker des données hors ligne volumineuses dans le téléphone de l'utilisateur (plus de 100 Mo) dans un crypté base de données. Si possible, je souhaite également distribuer la base de données pré-remplie. J'ai également vu this .

Je connais la chose webdatabase , mais parce qu'elle est dépréciée , on me conseille de ne pas travailler avec ça.

J'ai également vu des plugins tiers tels que SQLite Plugin , mais cela ne fonctionne que pour les appareils iOS et Android appareils, mais je cible 4 plates-formes (ios, Android, blackberry) , les fenêtres)

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

33
noway

J'ai récemment créé une application qui l'exigeait, ciblant les mêmes systèmes d'exploitation. Vous pouvez utiliser une combinaison de 2 bases de données:

1. LocalStorage ::

Vérifiez localStorage

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

Définissez un élément dans LocalStorage

localStorage.setItem("bar", foo);

ou

localStorage["bar"] = foo;

Obtenez un élément de LocalStorage

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

ou

var foo = localStorage["bar"];

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

Configurez 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 la dernière option :)

3. Stockage natif sur tous les appareils

C'est la meilleure partie de Phonegap. Vous pouvez appeler une classe de plug-in native sur tous les appareils à l'aide de l'appel du plug-in Phonegap. Pendant l'appel, vous pouvez transmettre des paramètres à la classe et la classe native peut stocker vos données dans le système d'exploitation lui-même.

Par exemple :: dans iOS, vous créez une classe de plugin .h & .m et l'enregistrez avec le fichier Cordova.plist. Une fois cela fait, vous devez envoyer un appel à la classe depuis JavaScript à l'aide de Phonegap. Une fois les paramètres reçus à l'aide de NSDictionary ou de tout autre type NSArray, vous pouvez appeler une classe CoreData pour stocker des quantités de données ILLIMITÉES. Vous ne manquerez jamais de mémoire.

Cela peut être fait de la même manière pour tous les autres systèmes d'exploitation :)

Pour le chiffrement, essayez ce qui suit :: SQLCipher

Voici quelques informations supplémentaires sur l'utilisation d'une base de données SQLite existante. Dans cet exemple, encrypted.db est cette 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
SashaZd

Dans la spécification W3C pour webdatabase , il est mentionné que le groupe de travail des applications Web continue de travailler sur deux autres spécifications liées au stockage: stockage Web et API de base de données indexée .

La spécification de la base de données Web n'est donc 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 objets suivants pour y parvenir:

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

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

Une limite généralement arbitraire de cinq mégaoctets par origine est recommandée.

À mon avis, SQLite est la meilleure option disponible car il s'agit d'une bibliothèque en cours de processus qui implémente un moteur de base de données SQL transactionnel autonome, sans serveur et sans configuration. De plus, le limites SQLite semble couvrir vos besoins:

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

En ce qui concerne vos exigences de chiffrement, vous devez considérer le SQLCipher qui est une extension SQLite.

SQLCipher est une extension SQLite qui fournit un cryptage AES 256 bits transparent des fichiers de base de données. À ce jour, il a été open source, sponsorisé et maintenu par Zetetic LLC. Dans l'espace mobile, SQLCipher est largement utilisé dans iOS d'Apple, ainsi que Nokia/QT depuis un certain temps.

Une autre option consiste à crypter et décrypter vos données lors de l'écriture et de la lecture de votre base de données.

J'espère que ça aide.

4

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

1
ahmed wahba

L'application mobile sur laquelle je travaille a une exigence similaire. Il nécessite un accès hors ligne à une table de pièces 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é la base de données indexée, mais les navigateurs mobiles dans iOS et Android ne le prennent pas en charge. Le stockage local Web n'est pas une option en raison de sa limite de 5 Mo. J'ai donc décidé d'utiliser le Web Standard de la base de données SQL ( http://www.w3.org/TR/webdatabase/ ) même s'il est obsolète. 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 la 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 pour fonctionner avec cette norme (voir http: // docs. phonegap.com/en/2.5.0/cordova_storage_storage.md.html#Storage ).

J'ai écrit un Java qui convertit les données JSON téléchargées en une base de données SQLite dont les fichiers sont empaquetés dans le cadre du Android APK ou du package d'application iOS).

Lorsque mon application mobile Phonegap démarre, elle utilise du 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 base de données à partir du package d'application.

Mon implémentation est basée sur l'exemple de code que j'ai trouvé sur le lien ci-dessous. J'espère que ça 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
jkwuc89
0
UBIK LOAD PACK