2010-09-27 24 views
2

我試圖減少我對Android數據庫的查詢次數。基本上我想獲得任何包含用戶定義的搜索詞的電子郵件或即時消息地址。現在我做的兩個單獨的查詢:你可以在Android的一個語句中查詢兩個表嗎?

電子郵件:

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是不同的。

Simon

回答

0

我發現,如果你不喜歡這樣的查詢:

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

你會得到一個非常大的表中的所有數據。然後,您需要檢查mimetype列以找出該行中包含的數據類型。從中您可以提取給定聯繫人的所有電子郵件和即時消息。

+0

感謝這實際上是我最終使用的方法。 – 2011-02-28 02:02:47

0

如果您正在開發自己的內容提供商,你簡單地需要添加新的URI並在處理它時執行自定義查詢。

但是,如果您使用第三方內容提供程序是不可能的,因爲SQLite數據庫(或其他東西)是封裝它的消費者。

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

如果您有權訪問數據庫,則此方法可行,但在使用聯繫人時,我們必須使用ContentResolver。還要檢查你的最後一個例子,它可能不會編譯,因爲''b.id'''不是'String []',它可能不會達到你期望的效果。 – Sam 2012-09-27 17:46:54

相關問題