Phonegap离线数据库
我想在用户手机(超过100 MB)中存储一些大的离线数据在一个encryption的数据库。 如果可能的话,我也想分发预先填充的数据库。 我也看到了这一点 。
我知道webdatabase的东西,但因为它折旧了 ,所以我build议不要这样做 。
我也看到了一些第三方插件,如SQLite插件 ,但它只适用于iOS和Android设备,但我的目标是4个平台(iOS,Android,黑莓,Windows)
有没有其他的解决办法,除了写下我自己的?
我最近做了一个应用程序需要这个,瞄准相同的操作系统。 您可以使用2个数据库的组合:
1. LocalStorage ::
检查localStorage
function supports_html5_storage() { try { return 'localStorage' in window && window['localStorage'] !== null; } catch (e) { return false; } }
将项目设置为LocalStorage
localStorage.setItem("bar", foo);
要么
localStorage["bar"] = foo;
从LocalStorage获取一个项目
var foo = localStorage.getItem("bar");
要么
var foo = localStorage["bar"];
2. SQLite数据库(更方便,更持久)
设置你的数据库
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);
创build你的表格
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)"); }
执行一个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); } }); });
编辑::我忘了添加在最后一个选项:)
3.所有设备上的本地存储
这是Phonegap最好的部分。 您可以使用Phonegap插件调用在所有设备上调用本机插件类。 在调用过程中,可以将parameter passing给类,本地类可以将数据存储在操作系统本身中。
例如,在iOS中,您将创build一个插件.h&.m类,并将其注册到Cordova.plist文件中。 一旦完成,您需要使用Phonegap从JavaScript发送一个调用。 一旦使用NSDictionary或任何其他NSArraytypes接收到参数,可以调用CoreData类来存储无限量的数据。 你永远不会用完内存。
这可以以类似的方式完成所有其余的操作系统也:)
对于encryption,请尝试以下:: SQLCipher
以下是关于使用现有SQLite数据库的一些附加信息。 在这个例子中,encrypted.db是你创build的全新数据库和编译指示。
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;
在Web 数据库的W3C规范中提到,Web应用程序工作组继续处理另外两个与存储相关的规范: Web存储和索引数据库API 。
所以webdatabase规范不再是活动的,而另外两个规范是活动的。
Web存储可以用来在用户的浏览器中本地存储数据。 有以下的目的来实现这一点:
- 存储数据而不失效date的localStorage
- sessionStorage存储一个会话的数据
Web存储不build议您的情况(超过100MB),因为W3C规范提到:
build议每个源5兆字节的任意限制。
在我看来,SQLite是最好的select,因为它是一个进程内库,它实现了一个自包含的,无服务器的,零configuration的事务性SQL数据库引擎。 而且, SQLite限制似乎涵盖了您的需求:
SQLITE_MAX_PAGE_COUNT的最大可能设置是2147483646.使用最大页面大小为65536时,最大SQLite数据库大小约为140 TB。
关于你的encryption要求,你应该考虑SQLCipher这是一个SQLite扩展。
SQLCipher是一种SQLite扩展,提供对数据库文件的透明256位AESencryption。 到目前为止,它已经由Zetetic LLC公司开源,赞助和维护。 在移动领域,SQLCipher已经在苹果的iOS以及Nokia / QT中广泛使用了相当长的一段时间。
另一种select是在写入和读取数据库时encryption和解密数据。
我希望这有帮助。
我正在使用的移动应用程序也有类似的要求。 它需要离线访问零件表,其中包含近500,000个不同的零件。 这个表的来源是通过一个定义良好的GET URL从服务器获取JSON。
我认为索引数据库,但iOS和Android内的移动浏览器不支持这一点。 Web本地存储不是一个选项,因为它的5 MB的硬性限制。 所以,我决定使用Web SQL数据库标准( http://www.w3.org/TR/webdatabase/ ),尽pipe它已被弃用。 我迄今为止使用Web SQL数据库的经验非常好。 数据库操作性能非常好,在我支持的移动设备(iPad 2,iPad 3,Motorola Xyboard,Samsung Galaxy Tab 2)上非常可靠。 此外,Phonegap公开了一个JavaScript API来使用该标准(请参阅http://docs.phonegap.com/en/2.5.0/cordova_storage_storage.md.html#Storage )。
我编写了一个Java实用程序,将下载的JSON数据转换为SQLite数据库,其文件作为Android APK或iOS应用程序包的一部分进行打包。
当我的PhoneGap移动应用程序启动时,它使用本地代码来检查应用程序的私有数据目录是否存在SQLite数据库文件。 如果文件不存在,则本地代码将从应用程序包复制数据库文件。
我的实现基于我在下面的链接中find的示例代码。 我希望这有帮助。 如果您对我的特定实施有任何疑问,请告知我们。
http://gauravstomar.blogspot.com/2011/08/prepopulate-sqlite-in-phonegap.html
我尝试使用LokiJS作为本地数据库,并发现它在非关系数据中很有帮助。 在我的情况下,我检索服务器上使用MongoDB存储的数据,但这取决于您的系统的性质
看到这些问题/答案:
-
在iOS中离线打开和存储encryption文档
-
PhoneGap / Apache Cordova提出了一个用于encryptionSQLite数据库的API
-
当使用Mono Touch时,我还可以打包标准的Window应用程序吗?