2012-09-21 17 views
4

我似乎沒有找到關於查詢,插入或任何其他SQL方法返回null的任何信息。但是如果發生錯誤就會發生。我只是想知道遊標是否爲空意味着發生了錯誤,或者是否意味着沒有選擇行(例如)?我不知道該如何對待它 - 作爲一個錯誤或者可能會不時發生的事情。什麼時候查詢在Android上返回空?

回答

7

我不相信你需要檢查if(cursor == null) {}

首先
如果您的查詢不返回任何行,您會收到一個空光標。光標將不是null

有很多方法來檢查光標是空的:

  • if(cursor.getCount == 0) {}
  • if(!cursor.moveToFirst()) {}

其實所有的光標#的moveTo的...()方法返回要麼truefalse,如果您收到false那麼您請求的行不存在。


如果發生錯誤,那麼你需要趕在try-catch塊的錯誤,否則應用程序會崩潰從一個未處理的異常。


而且insert()update()delete()返回一個整數,而不是光標。這些方法返回受您的語句影響的行數,如果沒有行受到影響,則這些方法返回0

+0

那麼,爲什麼所有的例子,我看到有一個像'如果(指針!= NULL &&光標代碼。moveToFirst()){...}'? – Pijusn

+1

可能(但不合邏輯)從創建一個錯誤的光標中捕獲錯誤,並且不創建一個備用的光標。這是我知道的唯一一次可以創建一個空遊標。不過,我相信如果你要花時間去捕捉異常,你應該創建一個「默認」光標(就像一個空白的光標)。 – Sam

+0

它已經發生在我身上,從rawQuery返回的遊標始終爲空,我不知道發生了什麼,數據庫在那裏,它不是空的,返回值總是爲空,它不是空的遊標,它只是空。不知道爲什麼。除了當我移動光標時,我沒有任何異常輸出。 – cdytoby

-2

當沒有行遊標結果中選擇返回(-1),如果發生錯誤,光標可以爲空

0

如果我們看一下Android源代碼,從https://github.com/android/platform_frameworks_base/blob/master/core/java/android/database/sqlite/SQLiteDirectCursorDriver.java,其中多數查詢結束:

public Cursor query(CursorFactory factory, String[] selectionArgs) { 
    final SQLiteQuery query = new SQLiteQuery(mDatabase, mSql, mCancellationSignal); 
    final Cursor cursor; 
    try { 
     query.bindAllArgsAsStrings(selectionArgs); 

     if (factory == null) { 
      cursor = new SQLiteCursor(this, mEditTable, query); 
     } else { 
      cursor = factory.newCursor(mDatabase, this, mEditTable, query); 
     } 
    } catch (RuntimeException ex) { 
     query.close(); 
     throw ex; 
    } 

    mQuery = query; 
    return cursor; 
} 

你可以很容易地看到,在不那麼分配RuntimeExceptionCursor局部變量的唯一案例將被拋出。這個函數的含義不能返回null。

如果使用,您可以假設從工廠獲得RuntimeException。查看SQLiteQuerySQLiteCursor的構造函數似乎沒有出現異常。你可以得到一個IllegalArgumentException如果您的綁定中query.bindAllArgsAsStrings(selectionArgs);

注意的SQLiteException是不正確的,可以在讀的非空CursorSQLiteQuery後拋出。

說具體Android源代碼一直沒有更新,因爲2012年是穩定的

相關問題