HTML5 Web SQL数据库问题

时间:2012-12-05 16:18:08

标签: android ios cordova web-sql

我的公司目前正在转向新架构,以及为移动设备提供服务的模型。我们的应用程序传统上是基于Web的( HTML5 / CSS3 / JS / PHP / MYSQL ),因此我们希望能够将其移植到移动平台而无需重新发明轮子( Cordova ),以及独立方式的桌面( AppJS ),这样我们就不必担心依赖于浏览器的错误了。我们也正在从 PHP 过渡到 NodeJS ,以使其更加可行。

问题是我们的用户需要离线使用我们的应用程序,在将它们“同步”到我们的服务器之前,他们可以存储多长时间或多少数据没有实际限制。

使用AppJS,这不是问题,因为它们可以在sqlite数据库中根据需要存储尽可能多的数据。但是,我发现了有关WebSQL数据和cordova / phonegap的 5MB配额的问题。这对我们的业务需求提出了明显的技术挑战。

我知道有几个插件可以让你使用sqlite数据。原来的sqlite插件(https://github.com/davibe/Phonegap-SQLitePlugin)缺少文档android和另一个(https://github.com/chbrody/Cordova-SQLitePlugin)要求我指定一个显然不可能的数据限制。因此,我只有很少的选择,一个是将数据库拆分成多个5MB段,由JS包装器控制。

您是否可以将较大的数据结构切换为多个5MB的websql数据库,并且在iOS和Android上没有问题?

iOS和Android上的websql数据库总数是否有限制?

您建议我们查看其他任何选项吗?我们需要能够使用现有的HTML5和CSS作为前端!

修改

我们的原始架构从未真正适用于平板电脑设备。这是我们希望用cordova解决的问题,以及构建更稳定的解决方案。最初,我们的离线产品运行在Server2Go堆栈上,由于客户端计算机上运行的各种应用程序存在各种平台问题

3 个答案:

答案 0 :(得分:1)

对于Android平台,您可以创建一个本机应用程序,然后使用webview显示前端(如果它确实非常重要,以保持HTML),然后使用javascript桥接器允许WebView中的内容与您的原生应用互动。

根据您对应用程序的描述,我认为您最好创建一个本机应用程序。正如您在评论中所说,您切换平台的原因之一是由于缺乏控制。为什么然后通过在您的堆栈中引入各种混合应用程序框架立即重新打开这些蠕虫。

长话短说,如果你采用原生方法,你将拥有完全控制权(很可能是更好的产品)。

答案 1 :(得分:0)

一般来说,我建议使用草坪椅,以便您可以与实施无关。 http://brian.io/lawnchair/adapters/

  

您是否可以将较大的数据结构切换为多个5MB的websql   数据库在iOS和Android上没有问题?

在我了解草坪之前,我实施了this using WebSQL,我有点后悔。 WebSQL数据库可以增长超过5MB。我不确定真正的最大值是多少,但我已经将我的Phonegap应用程序设置为100 * 1024 * 1024并且在Honeycomb Android上没有任何问题。

对于iOS,您可以使用SQLite database on PhoneGap / iOS - More than 5mb possible

答案 2 :(得分:0)

要获得一个真正的跨平台,跨浏览器的关系解决方案,该解决方案将脱机工作并具有必要的存储容量,我建议您使用:SequelSphere

由于它是100%的JavaScript解决方案,因此它应该可以在每个配置中使用,而不需要为每个配置提供不同的代码库。此外,它使用IndexedDB(如果可用,然后使用LocalStorage)将其数据存储在关系表中。我相信大多数浏览器对IndexedDB的存储量没有大小限制。我认为Firefox可能会有以下最初的50MB限制:Max size in IndexedDB

此外,还有一项名为“更改跟踪器”的新功能,可以通过跟踪表格的更改(插入/更新/删除),然后在您需要时向您报告,从而显着帮助数据同步过程。

作为额外的额外奖励,与WebSQL不同,SequelSphere非常友好。创建表格并不容易:

db.catalog.createTable({
    tableName: "EMPL",
    columns: [ "EMPL_ID", "NAME", "AGE", "DEPT_ID" ],
    primaryKey: [ "EMPL_ID" ],
    data: [
        [0,"Bob",32,0],
        [1,"John",37,2],
        [2,"Fred",28,1]
    ]
});

查询数据很简单:

var res = db.query("SELECT name, age, dept_id FROM empl WHERE Dept_ID = 2");

插入/更新/删除数据很简单:

db.insertRow("empl", [3, "Sue", 26, 2]);
db.updateRow("empl", [3, "Suzy", 26, 2]);
db.deleteRow("empl", [3, "Suzy", 26, 2]);

需要注意的一点是:由于这将在离线应用程序中使用,因此请确保将整个目录或每个表的“持久性范围”设置为“SCOPE_LOCAL”:

db.catalog.setPersistenceScope(db.SCOPE_LOCAL);
//  -or-
db.catalog.getTable("empl").setPersistenceScope(db.SCOPE_LOCAL);

如果您有任何疑问,请发送电子邮件给SequelSphere支持人员。

为了完全透明,我是SequelSphere的一部分,它似乎很好地回答了你的问题......;)