我似乎沒有找到關於查詢,插入或任何其他SQL方法返回null的任何信息。但是如果發生錯誤就會發生。我只是想知道遊標是否爲空意味着發生了錯誤,或者是否意味着沒有選擇行(例如)?我不知道該如何對待它 - 作爲一個錯誤或者可能會不時發生的事情。什麼時候查詢在Android上返回空?
回答
我不相信你需要檢查if(cursor == null) {}
。
首先
如果您的查詢不返回任何行,您會收到一個空光標。光標將不是是null
。
有很多方法來檢查光標是空的:
if(cursor.getCount == 0) {}
if(!cursor.moveToFirst()) {}
其實所有的光標#的moveTo的...()方法返回要麼true
或false
,如果您收到false
那麼您請求的行不存在。
二
如果發生錯誤,那麼你需要趕在try-catch塊的錯誤,否則應用程序會崩潰從一個未處理的異常。
而且insert()
,update()
和delete()
返回一個整數,而不是光標。這些方法返回受您的語句影響的行數,如果沒有行受到影響,則這些方法返回0
。
當沒有行遊標結果中選擇返回(-1),如果發生錯誤,光標可以爲空
如果我們看一下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;
}
你可以很容易地看到,在不那麼分配RuntimeException
爲Cursor
局部變量的唯一案例將被拋出。這個函數的含義不能返回null。
如果使用,您可以假設從工廠獲得RuntimeException
。查看SQLiteQuery
和SQLiteCursor
的構造函數似乎沒有出現異常。你可以得到一個IllegalArgumentException
如果您的綁定中query.bindAllArgsAsStrings(selectionArgs);
注意的SQLiteException
是不正確的,可以在讀的非空Cursor
從SQLiteQuery
後拋出。
說具體Android源代碼一直沒有更新,因爲2012年是穩定的
- 1. 什麼時候返回空集合,什麼時候不是?
- 2. 什麼時候返回null?
- 3. 什麼時候ssh2_scp_send()返回?
- 4. 什麼時候你返回一個類,你什麼時候返回一個HttpResponseMessage?
- 5. 爲什麼查詢返回空集合?
- 6. 爲什麼該查詢返回與空
- 7. 爲什麼Facebook FQL查詢返回空?
- 8. QTreeWidget :: currentItem什麼時候沒有選擇什麼時候返回?
- 9. API在什麼時候返回ERROR_MUI_FILE_NOT_LOADED?
- 10. 爲什麼空值不返回在申請的時候!=在LINQ
- 11. 在空表上的php中的sql查詢返回什麼?
- 12. 查找查詢爲空時,貓鼬會返回什麼?
- 13. LDAP查詢返回的時候
- 14. 實體框架linq查詢什麼時候返回動態代理類型,什麼時候沒有?
- 15. 爲什麼mysql查詢在返回null時不返回0
- 16. SPARQL查詢返回什麼
- 17. 查詢返回什麼
- 18. 什麼時候ref($ variable)返回'IO'?
- 19. 什麼時候WASAPI GetNextPacketSize返回0
- 20. 什麼時候Angular4 HttpClient.get()返回undefined?
- 21. 什麼時候ServletRequest.getRemoteAddr返回IPv6
- 22. 什麼時候php json_decode返回false?
- 23. 什麼時候ItemContainerGenerator.Status枚舉返回GeneratorStatus.Error?
- 24. 什麼時候EndResumeBookmark會返回BookmarkResumptionResult.NotReady?
- 25. 什麼時候findViewById()返回null?
- 26. 什麼時候的getInputStream()返回null?
- 27. 什麼時候socket.recv(recv_size)返回?
- 28. 什麼時候send()會返回EWOULDBLOCK?
- 29. 什麼時候getClass()。getName()返回void?
- 30. 什麼時候ShowDialog()返回null?
那麼,爲什麼所有的例子,我看到有一個像'如果(指針!= NULL &&光標代碼。moveToFirst()){...}'? – Pijusn
可能(但不合邏輯)從創建一個錯誤的光標中捕獲錯誤,並且不創建一個備用的光標。這是我知道的唯一一次可以創建一個空遊標。不過,我相信如果你要花時間去捕捉異常,你應該創建一個「默認」光標(就像一個空白的光標)。 – Sam
它已經發生在我身上,從rawQuery返回的遊標始終爲空,我不知道發生了什麼,數據庫在那裏,它不是空的,返回值總是爲空,它不是空的遊標,它只是空。不知道爲什麼。除了當我移動光標時,我沒有任何異常輸出。 – cdytoby