我使用来自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查询方法的回调函数中读取。
所有帮助表示赞赏。
答案 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 +插件)或所固有的方式(即返回的方式)正在打印价值观。)
鉴于打印结果的代码检查显示没有问题,重点集中在所使用的特定插件上,并切换到替代方案确认这是问题。