Cordova 上的 Sqlite,cordova-plugin-sqlite-2 限制为 32 位

Posted

技术标签:

【中文标题】Cordova 上的 Sqlite,cordova-plugin-sqlite-2 限制为 32 位【英文标题】:Sqlite on Cordova with cordova-plugin-sqlite-2 limits to 32 Bit 【发布时间】:2017-12-18 03:26:59 【问题描述】:

我使用 npm 的插件 cordova-plugin-sqlite-2 编写了一个 cordova 应用程序。

如果我插入大于 32 位的数字,整数会被截断。 所以如果我插入这个:

txn.executeSql("INSERT INTO Test (ID) VALUES (17179869322)",[]));

然后再次选择这些值:

txn.executeSql("SELECT * FROM Test",[],function(tx,data)console.log(data));

我明白了

+-----+
| ID  |
+-----+
| 138 |
+-----+

对我来说,数字似乎被截断了,尽管这应该只发生在 8 个字节之后。 我在这里做错了吗?

我在 android 7 手机上本地运行该应用程序。

经过一番测试,我发现在SQL语句中我仍然可以选择ID,但结果仍然是错误的。非常混乱:

txn.executeSql("SELECT * FROM Test where ID=17179869322",[],function(tx,data)console.log(data));

也会导致

+-----+
| ID  |
+-----+
| 138 |
+-----+

请注意,我没有对结果进行任何转换。在sqlite查询方法的回调函数中直接读取数字322。

感谢所有帮助。

【问题讨论】:

您能否将 DB 文件放到 PC 上并准确检查其中的内容(例如,使用sqlite3 命令行工具)? 332 是一个“奇怪的”截断...如果插件中有“32 位限制/截断”,我希望看到 138console.log 是做什么的?如果它不仅仅是对logcat 的简单打印,那么可能值得检查一下这并没有做奇怪的事情。 哎呀,复制粘贴错误。它实际上是 138。对不起,我会纠正这个问题。获取数据库文件并不容易,我没有root手机,所以我必须使用文件传输插件。我会看看我能做什么,然后报告。 如果您无法轻松获取 DB,请仔细检查打印机制。 SELECT 工作的事实(如查找记录)表明 SQLite 已存储完整值,但问题出在插件的回调或打印过程中。 所以,它实际上似乎是插件的限制。我在cordova上切换到SQlite的另一个实现,不再有这个问题。谢谢你的帮助!如果您以某种方式将您的评论变成答案,我将很高兴接受它:) 很高兴你已经解决了。添加了“如何解决这个问题”的答案。另外,我建议对标题进行编辑,以提及您使用的特定插件,这可能会帮助处于相同位置的其他人。 【参考方案1】:

通过 cmets 中的建议解决了问题(这是使用的插件的问题)。如果它对将来的任何人有所帮助,这里是该过程背后的思考的扩展版本。

在这种情况下,您必须将其视为消除问题——进行测试以确定哪个部分有问题。最明显的候选人是:

SQLite 处理 >32 位值的问题;

Cordova 框架作为一个整体存在 >32 位数字的问题;

你使用的具体插件有>32位数字问题;

您使用 Cordova 和/或插件的方式是错误处理 32 位数字;

其中,SQLite 的可能性最小,因为已知它可以处理 >32 位的数字。同样,虽然我没有使用它的个人经验,但 Cordova 很可能能够处理 >32 位的数字。

要分析其他选项,最有用的诊断可能是在插入后获取 SQLite 数据库的副本,并使用 SQLite 命令行来确定是否插入了正确的值。不幸的是,在这种情况下,这不太可能/容易。

但是,我们可以看到原始插入语句(INSERT INTO Test (ID) VALUES (17179869322))和目标选择语句(SELECT * FROM Test where ID=17179869322)都是“纯”SQL。这些可能会或多或少地直接传递给底层 SQLite 引擎,因此有望“工作”。这几乎可以通过以下事实得到证实:尽管 select 语句给出了错误的值,但它确实正确地返回了一行。

因此问题可能是或者框架中固有的(Cordova+插件)或者它的使用方式(即返回的方式)正在打印值)。

鉴于检查代码以打印结果显示没有问题,因此重点集中在使用的特定插件上,并切换到替代方案确认这就是问题所在。

【讨论】:

以上是关于Cordova 上的 Sqlite,cordova-plugin-sqlite-2 限制为 32 位的主要内容,如果未能解决你的问题,请参考以下文章

Ionic/Cordova SqLite 并不总是在来自 Play 商店的应用更新之间持续存在

在 Windows 10 中使用 cordova-plugin-file 复制 SQLite 数据库 cordova-sqlite-storage

Cordova/Phonegap SQLite 插件

插件cordova-sqlite-storage的问题

安装cordova-sqlite-storage时出错

Cordova Android:从任意目录打开 SQLite .db 数据库