组合来自三个表的数据以在ListView中显示

时间:2014-08-23 10:23:28

标签: android sql

我在一个Android应用程序上为一家公司工作,该应用程序应该使用REST API下载他们的产品目录并将其存储在设备上以供离线访问。

我下载了所有数据并将其存储在这些表中:

卖家:CREATE TABLE seller (_id INTEGER PRIMARY KEY NOT NULL, sellername TEXT, profileimglink TEXT, profileimgfilepath TEXT, profileimgfilesize INTEGER )

产品:CREATE TABLE item (_id INTEGER PRIMARY KEY NOT NULL, sellerid INTEGER, dateadded INTEGER, description TEXT, FOREIGN KEY (sellerid) REFERENCES seller (_id));

项目照片:CREATE TABLE photo (_id INTEGER PRIMARY KEY NOT NULL, itemid INTEGER, medialink TEXT, filepath TEXT, filesize TEXT, thumbnailpath TEXT, thumbnailsize TEXT, FOREIGN KEY (itemid) REFERENCES item (_id));

现在,我需要在ListView中显示数据,因此我实现了自定义游标适配器和自定义游标加载器(基于https://stackoverflow.com/a/7422343/1723459)。

使用此查询Cursor loadInBackground()SELECT item._id, item.dateadded, item.description, seller.sellername, seller.profileimgfilepath FROM item, seller WHERE seller._id = item.sellerid;中将卖家和商品放在一起相当容易,但我需要以某种方式添加照片的缩略图,如果有任何(可以是任何数字) 0到10之间,来自"照片"表混合

我考虑在游标适配器的SELECT thumbnailpath FROM photos WHERE itemid=SomeIdThatIJustGotFromTheCursor;中使用单独的查询(void bindView(View view, Context context, Cursor cursor)),但是根据我收集的内容,它在UI线程上运行,我在&#39 ;而不是在那里做任何数据库操作。

我还考虑过在Cursor loadInBackground()方法中扩展查询,但我对SQL没有多少经验,而且我不太清楚怎么做,尤其是因为它可能没有与该项目相关的图像。实际上,即使我知道怎么做,我也确定它会为每张图片生成一行,卖家和物品的数据会重复。现在,如果我错了,请纠正我,但光标中每行不会void bindView(View view, Context context, Cursor cursor)调用一次?

所以,问题是:我应该如何(以及在​​哪里)从这3个表中获取数据,以便我可以在ListView中显示它。

2 个答案:

答案 0 :(得分:1)

我已经设法在游标加载器Cursor loadInBackground()内使用此查询来解决问题:

SELECT item._id, item.description, item.dateadded, seller.sellername, 
seller.profileimgfilepath, group_concat(photo.thumbnailpath, ":") AS photopaths
FROM item
JOIN seller ON seller._id = item.sellerid
LEFT OUTER JOIN photo ON item._id=photo.itemid
GROUP BY item._id ORDER BY item.date DESC;

如果没有与该项目相关的照片,则LEFT OUTER JOIN会遗漏空单元格,但如果它们存在,则会将一个名为group_concat(columnname, "separator")的漂亮小功能与GROUP BY子句一起填充单元格的内容,其中包含由指定分隔符分隔的路径字符串列表(我使用Android' s File.pathSeparator)。

答案 1 :(得分:0)

您应该使用this class在loadInBackground()中进行查询。然后返回光标。

在你的onLoadFinished中,你应该开始填充你的列表视图