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 位限制/截断”,我希望看到 138
。 console.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