我在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
答案 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显示存储类)
按照:-
这些表明仅使用列和值仅返回1或两行,因为 longitude1 值具有不同的存储类(第一行为TEXT,第二行为REAL)和与您的问题有关。
这两个都显示使用 longitude1 列使用 CAST 来 REAL 提取了这两行。