我可以用ContentResolver.query()执行这个Android查询吗?(左连接和案例)

我可以用ContentResolver.query()执行这个Android查询吗?(左连接和案例),android,sql,left-join,android-contacts,android-contentresolver,Android,Sql,Left Join,Android Contacts,Android Contentresolver,我希望在Android上用伪代码执行以下查询: SELECT C.ID, C.NAME, CASE ISNULL(G.GROUPID,0) = 0 THEN 0 ELSE 1 END INGROUP FROM CONTACTS C LEFT JOIN GROUPMEMBERSHIP G ON G.CONTACTID = C.ID AND G.GROUPID = ? 我希望通过默认的contacts ContentProvider以及 0/1字段,指示联系人是否为组?的成员 当然,我可以很容易

我希望在Android上用伪代码执行以下查询:

SELECT C.ID, C.NAME, CASE ISNULL(G.GROUPID,0) = 0 THEN 0 ELSE 1 END INGROUP
FROM CONTACTS C 
LEFT JOIN GROUPMEMBERSHIP G ON G.CONTACTID = C.ID AND G.GROUPID = ?
我希望通过默认的contacts ContentProvider以及 0/1字段,指示联系人是否为组?的成员

当然,我可以很容易地获取所有联系人,然后在适配器类中很容易地分别循环和查询成员资格,但是我可以想象执行两个查询,因为一个外部连接的查询将产生更好的性能


我可以用标准的高级字符串投影和ContentResolver.query方法来实现这一点吗?或者这种查询需要深入研究更直接的SQL执行吗?

不,不能使用ContentResolver.query方法进行这种查询。 您将需要编写如下内容:

SQLiteDatabase db = YourActivity.getDbHelper().getReadableDatabase();
String query = yourLongQuery;
Cursor c = db.rawQuery(query, null);
YourActivity.startManagingCursor(c);
c.setNotificationUri(YourActivity.getContentResolver(), YourContentProvider.CONTENT_URI);

您不能这样做,因为ContentResolver只有一个查询方法:

    query(Uri uri, String[] projection, String selection, 
String[] selectionArgs, String sortOrder)
表或FROM子句没有参数。

编辑:好的,这实际上并不能解决问题,因为正如他们在问题中提到的,eidylon与现有的ContentProvider绑定。但是,如果您拥有ContentProvider源和API,则本节将介绍如何进行连接。所以我会留给那些想知道如何处理这个案子的人

这很容易!但不直观…:

query(Uri uri, String[] projection, String selection, 
String[] selectionArgs, String sortOrder)
好的,那么什么是URI?通常,每个表都有一个URI

content://com.example.coolapp.contacts 从联系人表中提供数据。 content://com.example.coolapp.groupmembers 从GROUPMEMBERSHIP表中提供数据

但URI实际上只是一个字符串。随便你怎么用。在ContentProvider中生成一块代码,用于响应content://com.example.coolapp.contacts_in_group. 在ContentProvider中的代码块中,您可以获得对SQLite DB的原始访问,而不受受限查询数据模型的限制。请随意使用它

根据需要定义选择字段。它们不必映射到表列名,而是按照您需要的方式映射它们,以便输入参数

定义您需要的投影方式-它可能包含联接后两个表中的列


宾,你完了。谷歌在自己的代码中也使用了同样的模式——看看联系人提供商API——你可以看到bla.rawscontact和bla.Contact等内容URI。每个URI都从数据库中的同一个表中提供数据——不同的URI只提供同一个表的不同视图

通过四处搜索,我得到的印象是,您无法使用SQLLiteDatabase查询其他应用程序。。。在我的例子中,联系人uri,但仅用于查询您自己的数据存储。这是正确的吗?在这种情况下,我想在绑定我的活动时,我将不得不在适配器类中执行子查询。@eidylon:我不知道你在查询联系人数据库。是的,你说得对:该死!哦,好吧。。。向前,向上!谢谢归根结底,一个人必须是内容提供者,并定义一个特殊的URI,然后根据复杂性构建特殊的查询。对吧?@埃迪扬-我想你可以接受麦克阿瑟的回答。谢谢你的回答。。。它非常详细,信息丰富,所以我投了赞成票;但显然是我在Q中不清楚我是在查询Android联系人数据库,而不是我自己的数据库。你不是唯一错过这个的人。我已经更新了我的措辞,使之更清楚一些。谢谢对不起,是的。如果您使用的是现有的contactProvider,那么您将无法使用它们实现的任何内容URI和联接。因此,总而言之,在您的ContentProvider中,覆盖查询方法,检查您的URI,并通过直接连接到SQLite db来做任何您想做的事情?谢谢@jcwenger你能给出一个在contentResolver上使用内部连接的示例代码吗?@jcwenger,你认为你能帮上忙吗?