sendtags and database sqlite cordova phonegap-plugins

database - and - sqlite ionic



Base de datos sin conexión de Phonegap (5)

Quiero almacenar algunos datos grandes fuera de línea en el teléfono del usuario (más de 100 MB) en una base de datos cifrada . Si es posible, también quiero distribuir la base de datos previamente poblada. También he visto this .

Sé sobre la base de datos webdatabase , pero como está depreciated , se me aconseja no trabajar con eso.

También he visto algunos complementos de terceros como SQLite Plugin , pero solo funciona para dispositivos iOS y Android, pero me dirijo a 4 plataformas (ios, android, blackberry, windows)

¿Hay alguna otra solución, aparte de escribir la mía?


En la especificación W3C para depreciated se menciona que el Grupo de trabajo de aplicaciones web continúa trabajando en otras dos especificaciones relacionadas con el almacenamiento: almacenamiento web y API de base de datos indexada .

Entonces, la especificación de la base de datos web ya no está activa, pero las otras dos especificaciones están activas.

El almacenamiento web se puede usar para almacenar datos localmente en el navegador del usuario. Hay los siguientes objetos para lograr eso:

  • localStorage que almacena datos sin fecha de caducidad
  • sessionStorage que almacena datos para una sesión

El Almacenamiento web no se recomienda para su caso (más de 100MB), porque la especificación W3C menciona que:

Se recomienda un límite mayoritariamente arbitrario de cinco megabytes por origen.

En mi opinión, SQLite es la mejor opción disponible, ya que es una biblioteca en proceso que implementa un motor de base de datos SQL transaccional independiente, sin servidor y de configuración cero. Además, los límites de SQLite parecen cubrir sus necesidades:

La configuración más grande posible para SQLITE_MAX_PAGE_COUNT es 2147483646. Cuando se utiliza con el tamaño de página máximo de 65536, esto proporciona un tamaño máximo de base de datos SQLite de aproximadamente 140 terabytes.

En cuanto a sus requisitos de cifrado, debe considerar SQLCipher que es una extensión de SQLite.

SQLCipher es una extensión de SQLite que proporciona cifrado AES transparente de 256 bits de archivos de base de datos. Hasta la fecha, ha sido de código abierto, patrocinado y mantenido por Zetetic LLC. En el espacio móvil, SQLCipher ha disfrutado de un uso generalizado en iOS de Apple, así como en Nokia / QT durante bastante tiempo.

Una opción alternativa es cifrar y descifrar sus datos al escribir y leer su base de datos.

Espero que esto ayude.


Hace poco hice una aplicación que requería esto, apuntándome al mismo sistema operativo. Puede usar una combinación de 2 bases de datos:

1. LocalStorage ::

Comprobar localStorage

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

Establecer un elemento en LocalStorage

localStorage.setItem("bar", foo);

o

localStorage["bar"] = foo;

Obtener un artículo de LocalStorage

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

o

var foo = localStorage["bar"];

2. Base de datos SQLite (más conveniente, más persistente)

Configura tu 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);

Crea tus tablas

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)"); }

Ejecutar una consulta 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 :: Olvidé agregar en la última opción :)

3. Almacenamiento nativo en todos los dispositivos

Esta es la mejor parte de Phonegap. Puede llamar a una clase de complemento nativo en todos los dispositivos usando la llamada del complemento Phonegap. Durante la llamada, puede pasar parámetros a la clase, y la clase nativa puede almacenar sus datos en el sistema operativo.

Por ejemplo :: en iOS, crea un complemento .h & .m clase y lo registra con el archivo Cordova.plist. Una vez hecho esto, debe enviar una llamada a la clase desde JavaScript usando Phonegap. Una vez que los parámetros se han recibido usando NSDictionary o cualquier otro tipo de NSArray, puede llamar a una clase CoreData para almacenar cantidades ILIMITADAS de datos. Nunca se quedará sin memoria.

Esto se puede hacer de manera similar para todo el resto del sistema operativo también :)

Para encriptación, pruebe lo siguiente :: SQLCipher

Aquí hay información adicional sobre cómo trabajar con una base de datos SQLite existente. En este ejemplo, encrypted.db es la nueva base de datos que usted crea y 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;


Intenté usar LokiJS como una base de datos local, y lo encontré útil en datos no relacionales. En mi caso, recupero una información almacenada usando MongoDB en el servidor, pero depende de la naturaleza de su sistema


La aplicación móvil en la que estoy trabajando tiene un requisito similar. Requiere acceso sin conexión a una tabla de partes que contiene cerca de 500,000 partes diferentes en ella. La fuente de esta tabla se extrae del servidor al obtener su JSON a través de una URL GET bien definida.

Consideré la base de datos indexada, pero los navegadores móviles dentro de iOS y Android no son compatibles. El almacenamiento local web no es una opción debido a su límite de 5 MB. Por lo tanto, decidí usar el estándar Web SQL Database ( http://www.w3.org/TR/webdatabase/ ) aunque esté en desuso. Mi experiencia hasta ahora con el uso de la base de datos web SQL ha sido muy buena. Las operaciones de la base de datos funcionan muy bien y son muy confiables en los dispositivos móviles que soporto (iPad 2, iPad 3, Motorola Xyboard, Samsung Galaxy Tab 2). Además, Phonegap expone una API de JavaScript para que funcione con este estándar (consulte http://docs.phonegap.com/en/2.5.0/cordova_storage_storage.md.html#Storage ).

Escribí una utilidad de Java que convierte los datos JSON descargados en una base de datos SQLite cuyos archivos están empaquetados como parte de la APK de Android o del paquete de la aplicación iOS.

Cuando se inicia mi aplicación móvil Phonegap, usa código nativo para verificar el directorio de datos privados de la aplicación en busca de la presencia de los archivos de la base de datos SQLite. Si los archivos no están presentes, el código nativo copia los archivos de la base de datos del paquete de la aplicación.

Mi implementación se basa en el código de muestra que encontré en el siguiente enlace. Espero que esto ayude. Avíseme si tiene alguna pregunta sobre mi implementación particular.

this