我在一个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中显示它。
答案 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中,你应该开始填充你的列表视图