![](/img/trans.png)
[英]ContentResolver.query: CursorIndexOutOfBoundsException
[英]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.