Phonegap离线数据库

33

我想将一些< strong >大量离线数据(超过100 MB)存储在用户手机中,并使用< strong >加密数据库。如果可能,我还希望预装分发数据库。我也看到过这个链接

我知道有webdatabase这个东西,但因为它被认为是废弃的技术,建议我不要使用它。

我还看到了一些第三方插件,例如SQLite插件,但它仅适用于iOS和Android设备,而我则需要针对4个平台(ios、android、blackberry、windows)进行开发。

除了自己编写代码之外,还有其他解决方案吗?


SQLite 在黑莓上也能很好地工作。 - SpetsnaZ
你认为在所有四个平台上实现本地化的可能解决方案是什么?关系型数据库真的必要吗?使用(二进制)文件就足够了吗? - user529543
我也想要一个跨越所有4个平台的解决方案。或者有没有插件或替代sqlite可以在Windows手机上使用? - Akash Deshpande
使用SQLCipher数据库。 - Monty
5个回答

35

最近我制作了一款需要使用以下两种数据库的应用程序,目标操作系统相同:

1. LocalStorage ::

检查localStorage是否可用

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

将一个项目存储到本地存储中

localStorage.setItem("bar", foo);
或者
localStorage["bar"] = foo;

从本地存储中获取一个项目

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

创建您的表格

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插件调用在所有设备上调用本机插件类。在调用期间,您可以将参数传递给类,而本机类可以将您的数据存储在操作系统本身中。

例如::在iOS中,您创建一个.plugin .h和.m类并将其注册到Cordova.plist文件中。完成后,您需要使用Phonegap从JavaScript发送对类的调用。使用NSDictionary或任何其他NSArray类型接收参数后,您可以调用CoreData类来存储无限量的数据。你永远不会用完内存。

也可以以类似的方式为所有其他操作系统执行此操作:)

要进行加密,请尝试以下方法:SQLCipher

以下是有关如何使用现有SQLite数据库的其他信息。在此示例中,encrypted.db是您创建的全新数据库和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;

3
顺便提一下,LocalStorage和SQLite在WP8和WP7、iOS和Android上都可以正常运行。经过尝试和测试,结果是成功的!(由于你说在WP上无法使SQL工作,所以我添加了这个评论。) - SashaZd
1
是的。您创建的数据库文件将存储在iOS应用程序的“文档”目录中(我认为在Android上也类似,但不确定)。下次打开应用程序时,它将引用与第一次创建时相同的db文件。 - SashaZd
1
LocalStorage非常方便,但是在这里几乎不是一个解决方案,因为问题说明将存储> 100mb文件。LocalStorage总共只有5mb的限制(除非我错过了一些秘密的PhoneGap技巧来规避此限制)。 - Adam
1
@Adam 是的,这就是为什么我给出了一个组合答案。你可以使用LocalStorage作为一种查找方式,但将实际数据存储在SQLite中或使用像我上面提到的Native存储插件。 - SashaZd
1
组合方法很好,但在答案中并不清楚您需要将LocalStorage与其他两个之一相结合,或者LocalStorage具有相当小的大小限制,远远小于问题所需。我只是想让它更清晰 :) - Adam
显示剩余6条评论

4
在W3C关于Web数据库的规范中提到,Web应用程序工作组正在继续开发另外两个与存储相关的规范:Web存储索引数据库API
因此,Web数据库规范不再活跃,但其他两个规范是活跃的。
Web存储可用于在用户浏览器中本地存储数据。以下是实现此目的的对象: localStorage,可存储没有过期日期的数据 sessionStorage,可为一个会话存储数据
由于W3C规范提到:“建议每个域限制为5MB的任意限制”,所以不建议使用Web存储来解决您的问题(超过100MB)。
在我看来,SQLite是最好的选择,因为它是一个进程内库,实现了自包含、无服务器、零配置、事务SQL数据库引擎。此外,SQLite限制似乎可以满足您的需求。
最大的SQLITE_MAX_PAGE_COUNT设置为2147483646。当与最大页面大小65536一起使用时,这将使SQLite数据库的最大大小约为140TB。
关于您的加密要求,您应该考虑使用SQLite扩展 SQLCipher
SQLCipher是一个SQLite扩展程序,提供数据库文件的透明256位AES加密。迄今为止,它已由Zetetic LLC赞助和维护,并开源。在移动领域,SQLCipher在苹果的iOS中以及诺基亚/ QT中已经广泛使用了相当长的时间。
另一种选择是在写入和读取数据库时加密和解密数据。
希望这可以帮到您。

2
这是一个非常概括的答案。并没有说明如何使其适用于Android或Windows Phone,正如问题所问。 - SashaZd

1
我正在开发的移动应用有一个类似的需求。它需要离线访问一个包含近500,000个不同零件的零件表。该表的源代码是通过获取其JSON数据的定义良好的GET URL从服务器中提取的。
我考虑使用Indexed DB,但iOS和Android内部的移动浏览器不支持它。Web本地存储不是一个选择,因为它有一个5 MB的硬限制。所以,尽管它已经被弃用了,我决定使用Web SQL数据库标准(http://www.w3.org/TR/webdatabase/)。到目前为止,我使用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数据库文件。如果文件不存在,则本机代码从应用程序包中复制数据库文件。
我的实现基于我在以下链接中找到的示例代码。希望这可以帮助您。如果您对我的特定实现有任何疑问,请告诉我。

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


1
我尝试使用LokiJS作为本地数据库,在非关系型数据方面发现它很有帮助。在我的情况下,我检索使用MongoDB存储在服务器上的数据,但这取决于您系统的性质。

0

如果您认为这是重复的问题,请标记它。请仅返回已翻译的文本。 - SashaZd
至少选择你认为最好回答这个问题的问答集,并重定向到那里。或者将最佳选择作为答案发布。不要只是链接所有可能的答案。 - SashaZd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接