在同一 table 上具有多个连接的内容提供者

Content provider with multiple joins on same table

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

table 评分:

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

table 用户:

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

查询生成器:

    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 );

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

是的,您可以使用 as 关键字为 table 设置别名。查看 https://www.sqlite.org/syntax/join-clause.html and https://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 table 的所有列添加前缀(例如 whereorder by).

假设您对两个用户(评级用户和评级用户)的用户名都感兴趣,您的预测将如下所示:

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