在同一个表上具有多个联接的内容提供程序

时间:2015-12-28 16:31:31

标签: android android-sqlite android-contentprovider

我正在使用具有CursorAdapter的ListView,并且查询通过LoaderManager完成到我的ContentProvider。一切似乎工作正常,但当我尝试使用相同的表执行多个查询时,我得到一个重复的列错误:

表评级:

 CREATE TABLE rating ( _id INTEGER PRIMARY KEY, message TEXT NOT NULL, 
      from_user_id INTEGER NOT NULL, to_user_id INTEGER NOT NUL);

表用户:

 CREATE TABLE users ( _id INTEGER PRIMARY KEY, name TEXT NOT NULL, 
      avatar TEXT, GENDER TEXT);

QueryBuilder的:

    queryBuilder = new SQLiteQueryBuilder();
    queryBuilder.setTables(rating LEFT JOIN users ON  
    rating.from_user_id = users._id LEFT JOIN users 
    ON rating.to_user_id = users._id );

有没有办法使用别名或任何类似的方法?

1 个答案:

答案 0 :(得分:1)

是的,您可以使用as关键字为表格设置别名。查看https://www.sqlite.org/syntax/join-clause.htmlhttps://www.sqlite.org/syntax/table-or-subquery.html

您的加入条款如下所示:

rating LEFT JOIN users as from_users ON rating.from_user_id = from_users._id
LEFT JOIN users as to_users ON rating.to_user_id = to_users._id

实际上,您只需要为users两次出现之一设置别名,但为两者设置别名会使其更易于阅读和理解。

请注意,您还需要为投影中的users表格以及查询的所有其他部分(例如whereorder by)添加前缀。

因此,鉴于您对两个用户(评级用户和评级用户)的用户名感兴趣,您的预测将如下所示:

new String[]{"from_users.name", "to_users.name"};