簡體   English   中英

是什么導致Android的ContentResolver.query()返回null?

[英]What causes Android's ContentResolver.query() to return null?

在什么條件下ContentResolver.query ()返回null而不是游標對象? 我之前有過空游標但只是意識到該方法也可以返回null。 但是,我無法追蹤發生這種情況的情況。

由於我今天收到的用於我的應用程序的用戶崩潰報告,我只是偶然發現了同樣的問題。 如果Android文檔不清楚它有助於查看源代碼。 這是我發現ContentResolver.query()返回null的原因:

  1. 無法獲取內容提供商。 這可能是由於指定的Uri存在問題,或者因為它根本不存在於系統上。 如果Uri是問題,原因是:protocol不是content://或者Uri沒有權限字符串部分(Uri.getAuthority()== null)。

  2. 獲取的提供程序的查詢方法本身返回null

  3. 可以獲取內容提供程序,但在查詢期間拋出了RemoteException

特別是因為(2.)因為沒有定義規則,所以可能導致null的原因幾乎是任意的。 但通常情況下,如果SQLite是ContentProvider的后端,您可以期望至少有一些空的Cursor對象而不是null

Android系統ContentProvider在返回任何內容之前會做一些檢查。 如果輸入不符合預期,則返回null的可能性很小。 但說實話,以前從未發生過這件事。 在查詢參數問題的情況下,我通常會收到IllegalArgumentException 也許一些ContentProvider實現在空結果集的情況下返回null

無論哪種方式。 似乎有必要始終檢查null 特別是原因數字(3.)可能會在任何Android設備上發生。

如果uri方案的格式不是content://或者方案本身的contentProvider不存在,則ContentResolver.query返回null。

在以下情況下,ContentResolver.query()將返回null:

  1. 如果您嘗試傳遞數據庫中不存在的列名(一個非常常見的情況是開發人員使用常量作為列名,因為它們看起來類似於列)。

  2. 它可能為null,因為您的URI參數無效。

可能還有其他情況會返回null。 但是,以上兩種情況是開發人員拔毛的常見原因:)

我有同樣的問題。 我的錯誤是不關閉提供者的Cursor,以便稍后的查詢調用導致null。

如果您忘記在清單中聲明提供程序,則查詢可能會返回null。

如果沒有結果,則返回null。 我的意思是說如果給定的數據庫查詢沒有結果(甚至不是單行數據),則query()返回null。

暫無
暫無

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

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