簡體   English   中英

我可以使用 ContentResolver.query() 執行這個 Android 查詢嗎? (左連接和大小寫)

[英]Can I perform this Android query with ContentResolver.query()? (LEFT JOIN and CASE)

我希望在 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 = ?

我正在尋找 select 系統通訊錄中所有聯系人的 ID 和名稱,通過默認的聯系人 ContentProvider,以及指示聯系人是否是組成員的 0/1 字段? .

我當然可以很容易地獲得所有聯系人,然后在我的適配器 class 中輕松地循環並單獨查詢成員資格,但我想將這兩個查詢作為一個外部連接查詢執行會產生更好的性能。

我可以使用標准的高級字符串投影和ContentResolver.query()方法來做到這一點嗎? 或者這種查詢是否需要深入研究更直接的 SQL 執行?

編輯:好的,所以這實際上並不能解決所提出的問題,因為 eidylon 與他們的問題中提到的現有 ContentProvider 相關聯。 但是,如果您擁有 ContentProvider 源和 API,這確實涵蓋了如何進行 JOIN。 所以我會把它留給那些想知道如何處理這種情況的人。


這很簡單。 但不直觀..::)

query(Uri uri, String[] projection, String selection, 
String[] selectionArgs, String sortOrder)

好的,那么 URI 是什么? 通常,每個表都有一個 URI。

content://com.example.coolapp.contacts從您的CONTACTS表中提供數據。 content://com.example.coolapp.groupmembers從您的GROUPMEMBERSHIP表中提供數據。

但 URI 實際上只是一個字符串。 隨心所欲地使用它。 在您的 ContentProvider 中創建一個響應content://com.example.coolapp.contacts_in_group的代碼塊。 在 ContentProvider 中的該代碼塊中,您可以獲得對 SQLite 數據庫的原始訪問權限,不受有限query()數據 model 的限制。 隨意使用它!

隨意定義您的選擇字段。 他們不必map 到表列名稱 - map 他們如何需要,以獲取您的參數。

定義您需要的投影——它可能包含連接后兩個表中的列。

賓,你完成了。 谷歌在他們自己的代碼內部執行同樣的 model - Go 查看聯系人提供程序 API - 你看到“bla.RawContact”和“bla.URI.Cont”等內容每個都從數據庫中的同一張表中提供數據——不同的 URI 只是提供同一張表的不同視圖

不,您不能使用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 子句沒有參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM