在SQLite中存储和查询纬度和经度不会产生预期的结果

时间:2018-09-18 21:47:36

标签: android database sqlite location where-clause

我在SQLite数据库中将位置(纬度和经度)保存为“双精度”数据类型,如下所示:     SELECT * FROM'位置'; all rows of table shown

但是,在进行经度查询时,它并不总是返回正确的结果,如下所示:     SELECT * FROM'locations'WHERE经度='-117.8496541'; query yield expected results

无效查询:     SELECT * FROM'locations'WHERE经度='-117.84457309999999'; query yields no results, which is incorrect

任何有关如何解决此问题的建议都将受到高度赞赏。 不是作业,它是我正在开发的Android应用程序的一部分。我在手机上使用Google本地地图保存了位置,然后将数据库提取到计算机中以测试位置查询。 谢谢。

编辑: 更多图片支持问题。

creating table with longitude of double datatype inserting row into db using ContentValues where longitude of double datatype

1 个答案:

答案 0 :(得分:0)

我相信您的问题与存储类/类型关联性有关。

相同的值可以不同地保存,因此可以不同地检索。

我相信您的解决方案可能会强制使用CAST检索类型。

通过使用:-

SELECT * FROM 'locations' WHERE CAST(longitude AS REAL) = '-117.84457309999999';

但是,最好只使用一种类型而不是TEXT和REAL的混合来存储值。

希望解释一下,请考虑以下问题:-

DROP TABLE IF EXISTS locations;
CREATE TABLE IF NOT EXISTS locations (
        longitude1,           -- BLOB type affinity as no type has been specified
        longitude2 TEXT, 
        longitude3 REAL, 
        longitude4 NUMERIC, 
        longitude5 INTEGER, 
        longitude6 BLOB,
        longitude7 rUmpleStilSkin
        );
INSERT INTO locations VALUES('-117.84457309999999','-117.84457309999999','-117.84457309999999','-117.84457309999999','-117.84457309999999','-117.84457309999999','-117.84457309999999');
INSERT INTO locations VALUES(-117.84457309999999,-117.84457309999999,-117.84457309999999,-117.84457309999999,-117.84457309999999,-117.84457309999999,-117.84457309999999);
SELECT rowid AS id,
    typeof(longitude1) AS l1type, longitude1,
    typeof(longitude2) AS l2type, longitude2,
    typeof(longitude3) AS l3type, longitude3,
    typeof(longitude4) AS l4type, longitude4,
    typeof(longitude5) AS l5type, longitude5,
    typeof(longitude6) AS l6type, longitude6,
    typeof(longitude7) AS l7type, longitude7
FROM locations;

SELECT rowid AS id,* FROM locations WHERE longitude1 = '-117.84457309999999';
SELECT rowid AS id,* FROM locations WHERE longitude1 = -117.84457309999999;
SELECT rowid AS id,* FROM locations WHERE CAST(longitude1 AS REAL) = -117.84457309999999;
SELECT rowid AS id,* FROM locations WHERE CAST(longitude1 AS REAL) = '-117.84457309999999';

存储的值(第一个查询)

第一个结果表明,即使使用了相同的值,这些值实际存储的方式也取决于类型相似性(typeof显示存储类)

按照:-

enter image description here

  • 当存储类别为REAL时,则使用缩写形式;而当存储类别为TEXT时,则存储完整形式。
  • 从第一张图片看来,这对值总是以不同的存储类存储。

第二和第三结果

这些表明仅使用列和值仅返回1或两行,因为 longitude1 值具有不同的存储类(第一行为TEXT,第二行为REAL)和与您的问题有关。

enter image description here

enter image description here

第四和第五个结果

这两个都显示使用 longitude1 列使用 CAST REAL 提取了这两行。

enter image description here

enter image description here

您可能希望阅读Datatypes In SQLite Version 3