Android上的SQLite:运行时与SQLite管理员的结果集不同

时间:2013-04-24 07:23:08

标签: android sqlite android-sqlite

我正在使用内部SQLite DB构建Android应用。 这是架构:

CREATE TABLE IF NOT EXISTS [tblImageVideoLink] (
[LinkID] INTEGER  NOT NULL PRIMARY KEY,
[ImageID] INTEGER  UNIQUE NOT NULL,
[VideoID] INTEGER  NULL
);

CREATE TABLE IF NOT EXISTS [tblImages] (
[ID] INTEGER  PRIMARY KEY NOT NULL,
[ImageName] VARCHAR(50)  NOT NULL,
[ImageDescription] VARCHAR(100)  NULL,
[Page] INTEGER  NULL
);

CREATE TABLE IF NOT EXISTS [tblPages] (
[ID] INTEGER  NOT NULL PRIMARY KEY,
[PageName] VARCHAR(30)  NULL
);

CREATE TABLE IF NOT EXISTS [tblVideos] (
[ID] INTEGER  NOT NULL PRIMARY KEY,
[VideoName] VARCHAR(150)  NOT NULL,
[VideoDescription] VARCHAR(100)  NULL,
[VideoType] VARCHAR(10)  NULL
);

CREATE INDEX IF NOT EXISTS [IDX_TBLIMAGEVIDEOLINK_IMAGEID] ON [tblImageVideoLink](
[ImageID]  DESC,
[VideoID]  DESC
);

CREATE INDEX IF NOT EXISTS [IDX_TBLIMAGES_PAGE] ON [tblImages](
[Page]  DESC
);

以下是表格中的相关数据:

INSERT INTO tblImages (ID, ImageName, Page) VALUES (1, 'Beach.jpg', 1);
INSERT INTO tblImages (ID, ImageName, Page) VALUES (2, 'Bowling.jpg', 1);
INSERT INTO tblImages (ID, ImageName, Page) VALUES (3, 'Car.jpg', 1);
INSERT INTO tblVideos (ID, VideoName) VALUES (2, 'Bowling.3gp');
INSERT INTO tblVideos (ID, VideoName) VALUES (3, 'Car.3gp');
INSERT INTO tblImageVideoLink (LinkID, ImageID, VideoID) VALUES (1, 2, 2);
INSERT INTO tblImageVideoLink (LinkID, ImageID, VideoID) VALUES (2, 3, 3);
INSERT INTO tblPages (ID, PageName) VALUES (1, 'Misc');

我正在尝试运行此查询以获取具有特定页面的所有图像及其相关视频:

SELECT DISTINCT I.ID AS 'Image ID', I.ImageName, V.ID AS 'Video ID', V.VideoName
FROM tblImages I
LEFT JOIN tblImageVideoLink L ON L.VideoID=V.ID
LEFT JOIN tblVideos V ON L.ImageID=I.ID
WHERE I.Page=1;

当我在SQLite Administrator中测试时,我得到所需的结果集,即: enter image description here

当我在应用程序(或SQLiteSpy)中测试它时,我得到一个不同的结果集: enter image description here

我已经尝试过我所知道的一切,包括GROUP BY,删除DISTINCT,不同的JOIN类型等等。

BTW,SQLiteSpy在底部写道:SQLite 3.7.8而SQLite管理员编写SQLite 3.5.1。我不知道这是否重要。

请帮助,并且还要解释为什么两个SQLite工具之间存在差异......

2 个答案:

答案 0 :(得分:0)

你在SQ​​Lite Admin中看到的是(考虑你的输出) SELECT DISTINCT(I.ImageName), V.VideoName

你在app中实际看到的是(考虑你的输出)相同的 SELECT DISTINCT(I.ImageName, V.VideoName)

试用括号

答案 1 :(得分:0)

亲爱的朋友和DBA帮助我发现了我的问题。这是加入两个表并获取我想要的数据集的工作查询:

SELECT DISTINCT I.ID AS 'Image ID', I.ImageName, V.ID AS 'Video ID', V.VideoName
FROM tblImages I
LEFT JOIN tblImageVideoLink L ON L.ImageID=I.ID
LEFT JOIN tblVideos V ON L.VideoID=V.ID
WHERE I.Page=1;

谢谢大家的帮助。