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

时间:2017-07-13 11:17:29

标签: android sqlite cordova

我使用来自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 |
+-----+

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

所有帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

问题是通过评论中的建议解决的(这是使用插件的问题)。如果它在将来帮助任何人,这里是这个过程背后的思想的扩展版本。

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

  • SQLite处理问题> 32位值;

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

  • 您使用的特定插件存在> 32位数字的问题;

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

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

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

但是,我们可以看到原始insert语句(INSERT INTO Test (ID) VALUES (17179869322))和目标select语句(SELECT * FROM Test where ID=17179869322)都是“纯”SQL。很可能它们会或多或少地直接传递给底层SQLite引擎,因此可能会“工作”。事实证明,虽然select语句给出了错误的值,但 正确地返回了一行。

因此问题可能是 框架(Cordova +插件)所固有的方式(即返回的方式)正在打印价值观。)

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