3

我的公司目前正在过渡到一种新的架构,以及一种为移动设备提供服务的模型。我们的应用程序传统上是基于 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 堆栈上运行,由于客户端机器上运行的各种应用程序存在各种平台问题

4

3 回答 3

1

对于 android 平台,您可以创建一个原生应用程序,然后使用 webview 显示前端(如果保留 HTML 真的那么重要),然后使用 javascript 桥允许 WebView 中的内容与您的交互本机应用程序。

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

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

于 2012-12-05T16:29:56.943 回答
0

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

您能否将较大的数据结构拆分为多个 5MB 的 websql 数据库,并且在 iOS 和 Android 上都没有问题?

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

对于 iOS,您可以在 PhoneGap/iOS 上使用 SQLite 数据库 - 可能超过 5mb

于 2012-12-06T03:32:27.560 回答
0

为了获得一个真正的跨平台、跨浏览器的关系解决方案,可以离线工作并具有必要的存储容量,我建议使用: SequelSphere

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

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

作为一个额外的好处,与 WebSQL 不同,SequelSphere 对 JSON 非常友好。创建表格再简单不过了:

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 的一部分,它似乎很好地回答了你的问题...... ;)

于 2012-12-07T20:02:50.260 回答