2013-11-20 95 views
0

我正在研究一個應用程序,它將所有內容存儲在數據庫中,並使用ContentProvider進行訪問。我的場景如下:ContentProvider/ContentResolver查詢按ID排序默認

  • 我打了一個Web調用並接收一個整數列表,它們代表了我需要從設備上的數據庫檢索的對象的ID。
  • 我使用以下選項撥打ContentResolver.query():

    選擇:_id =? OR _id =? OR _id =?

    選擇標識:30; 165; 149;

  • 所以,我需要得到所有項目的id是30,165或149.我需要他們在確切的順序

這是我在ContentResolver的製作精確電話:

Cursor cursor = mActivity.getContentResolver().query(myUri, null, selection, selectionIds, null); 

正如你所看到的,我沒有任何分揀階段。但是,結果爲我提供了一個Cursor,順序如下:30,149,165。因此,即使我沒有指定任何排序順序,它似乎默認通過_id排序。我的問題是,有沒有人知道阻止這種情況發生的方法?

回答

1

當您從任何數據庫中選擇行而未指定ORDER BY子句時,應該將結果順序視爲未定義,即可以按任何順序返回。你在這裏按_id排序的原因僅僅是由於情況 - 它們可能是按照底層數據庫文件的順序排列的,所以這是SQLite讀取它們的順序。但是,假設它總是會不安全是這樣。

因此,您的問題的實際答案是否定的,您不能假定SQLite將以任何特定順序返回您的行,而沒有ORDER BY子句。如果您無法提供這樣的條款(這裏似乎是這種情況),您必須在從光標獲取所有數據後,使用代碼對它們進行排序。

+0

啊,好的。感謝您花時間解釋。我將按照我希望他們從數據庫中獲得的方式進行排序。我曾假設它會是這樣,但那是錯誤的。 – ariets

1

這不是默認爲_id,它給你的記錄,因爲它們在數據庫(這恰好是按ID排序)。如果你不想要這個,請傳遞你自己的排序順序。

+0

感謝您的回答。正如我在其他答案中所說的,我認爲他們會按照我要求的順序出來,但這是一個令人難以置信的錯誤假設。再次感謝。 – ariets