在同一 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 的所有列添加前缀(例如 where
、order by
).
假设您对两个用户(评级用户和评级用户)的用户名都感兴趣,您的预测将如下所示:
new String[]{"from_users.name", "to_users.name"};
我正在使用具有 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 的所有列添加前缀(例如 where
、order by
).
假设您对两个用户(评级用户和评级用户)的用户名都感兴趣,您的预测将如下所示:
new String[]{"from_users.name", "to_users.name"};