首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Phonegap离线数据库

Phonegap离线数据库
EN

Stack Overflow用户
提问于 2012-08-17 11:38:18
回答 5查看 20.6K关注 0票数 33

我想将一些脱机数据存储在用户电话中(超过100 MB),存储在加密的数据库中。如果可能的话,我还想分发预填充的数据库。我也见过

我知道关于网络数据库的事情,但是因为它是折旧,所以我被建议不要使用它。

我也见过一些第三方插件,如SQLite插件,但它只适用于iOS和android设备,但我针对4个平台(ios、Android、blackberry、windows)。

除了写下我自己的东西之外,还有别的解决办法吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-04-04 12:50:21

我最近做了一个应用程序,它需要这样做,你可以使用两个数据库的组合:

1. LocalStorage ::

检查localStorage

代码语言:javascript
运行
复制
function supports_html5_storage() {
  try {
    return 'localStorage' in window && window['localStorage'] !== null;
  } catch (e) {
    return false;
  }
}

将项目设置为LocalStorage

代码语言:javascript
运行
复制
localStorage.setItem("bar", foo);

代码语言:javascript
运行
复制
localStorage["bar"] = foo;

从LocalStorage获取一个项目

代码语言:javascript
运行
复制
var foo = localStorage.getItem("bar");

代码语言:javascript
运行
复制
var foo = localStorage["bar"];

2. SQLite数据库(更方便、更灵活)

建立数据库

代码语言:javascript
运行
复制
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);

创建您的表

代码语言:javascript
运行
复制
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查询

代码语言:javascript
运行
复制
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插件调用在所有设备上调用本机插件类。在调用期间,您可以向类传递参数,并且本机类可以将数据存储在OS本身中。

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

对于所有操作系统的其他部分,也可以采用类似的方式:)

对于加密,请尝试如下:SQLCipher

下面是一些关于使用现有SQLite数据库的其他信息。在本例中,encrypted.db是您创建和实用的全新数据库。

代码语言:javascript
运行
复制
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;
票数 35
EN

Stack Overflow用户

发布于 2012-08-22 18:51:12

在W3C的网络数据库规范中,提到了Web工作组继续研究另外两种与存储相关的规范:Web存储索引数据库API

因此,are数据库规范不再是活动的,但其他两个规范是活动的。

Web存储可用于在用户浏览器中本地存储数据。实现这一目标的目标如下:

  • localStorage,它存储没有过期日期的数据。
  • 存储一个会话的数据的sessionStorage

不建议在您的情况下使用Web (超过100 Web),因为W3C规范提到:

建议对每个原点实行5兆字节的任意限制。

在我看来,SQLite是最好的可用选项,因为它是一个进程内库,它实现了一个自包含、无服务器、零配置、事务性的SQL数据库引擎。此外,SQLite极限似乎满足了您的需要:

SQLITE_MAX_PAGE_COUNT的最大可能设置是2147483646。当使用最大页大小为65536时,SQLite数据库的最大大小约为140 the。

关于您的加密需求,您应该考虑SQLCipher,它是一个SQLite扩展。

SQLCipher是一个SQLite扩展,它提供了对数据库文件的透明256位AES加密.到目前为止,它一直由Zetetic开源、赞助和维护.在移动领域,SQLCipher在苹果的iOS以及诺基亚/ QT上都得到了广泛的应用。

另一种选择是在写入和读取数据库时对数据进行加密和解密。

我希望这能帮到你。

票数 4
EN

Stack Overflow用户

发布于 2013-04-08 18:15:05

我正在开发的移动应用程序也有类似的要求。它需要离线访问包含近50万个不同部件的部件表。此表的源是通过定义良好的GET URL从服务器获取其JSON的。

我考虑过索引DB,但是iOS和Android内部的移动浏览器不支持这一点。Web本地存储不是一个选项,因为它的硬5 MB限制。因此,我决定使用(http://www.w3.org/TR/webdatabase/),尽管它不受欢迎。到目前为止,我在使用方面的经验非常好。在我支持的移动设备(iPad 2、iPad 3、摩托罗拉Xyboard、三星Galaxy 2)上,数据库操作表现良好,而且非常可靠。另外,Phonegap公开了一个JavaScript API来使用这个标准(参见storage.md.html#Storage)。

我编写了一个Java实用程序,将下载的JSON数据转换为SQLite数据库,该数据库的文件打包为Android或iOS应用程序包的一部分。

当我的Phonegap移动应用程序启动时,它使用本机代码检查应用程序的私有数据目录是否存在SQLite数据库文件。如果文件不存在,则本机代码将从应用程序包复制数据库文件。

我的实现基于我在下面的链接中找到的示例代码。我希望这能帮到你。如果你对我的具体实现有任何疑问,请告诉我。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12005042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档