你能在Android中的一个语句中查询两个表吗?

时间:2010-09-27 17:55:47

标签: sql android

我正在尝试减少对Android数据库的查询次数。基本上我想获得包含用户定义的搜索词的任何电子邮件或IM地址。现在我正在做两个单独的查询:

电子邮件:

Cursor emails = cr.query( 
    ContactsContract.CommonDataKinds.Email.CONTENT_URI, 
    null, 
    ContactsContract.CommonDataKinds.Email.DATA + " LIKE ?", 
    new String[] {searchTerm}, 
    null);

IM:

Cursor cursor = cr.query(
    ContactsContract.Data.CONTENT_URI, 
    null, 
    ContactsContract.CommonDataKinds.Im.DATA + " LIKE ?", 
    new String[] {searchTerm}, 
    null); 

有没有人知道将这两种查询结合起来的简单方法?问题的症结似乎是两个内容URI不同。

西蒙

4 个答案:

答案 0 :(得分:3)

您可以尝试使用MatrixCursor加入表格。

这是example

答案 1 :(得分:1)

此解决方案更容易:不使用ContentResolver。使用SQLiteDatabase db = bdd.getReadableDatabase()(bdd是您的SQLiteHelper)然后:

db.rawquery ("HERE YOU WRITE YOUR QUERY WITH TWO TABLES", "HERE SelectionArgs").

示例:

db.rawquery("SELECT a.*, b.id FROM TableA AS a, TableB AS b WHERE a.id=b.id", null);

或与其他打字相同:

db.rawquery("SELECT a.*, b.id FROM TableA AS a, TableB AS b WHERE a.id=?", "b.id");

我希望这会有所帮助。 ; - )

答案 2 :(得分:0)

您可以开发自己的内容提供商。您只需添加新URI并在处理时执行自定义查询。

但是,如果您使用第三方内容提供商是不可能的,因为SQLite数据库(或其他内容)是为其消费者封装的。

答案 3 :(得分:0)

我发现如果你这样做一个查询:

Cursor c = mApp.getContentResolver().query(ContactsContract.Data.CONTENT_URI,
    null,
    null,
    null,
    ContactsContract.Data.CONTACT_ID + " ASC");

您将获得一个包含所有数据的非常大的表。然后,您需要检查mimetype列以找出该行中包含的数据类型。从中您可以提取给定联系人的所有电子邮件和即时消息。