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