2017-06-16 41 views
0
1 Cursor resultSet = mydatbase.rawQuery("Select * from TutorialsPoint",null); 
2 String password1 = resultSet.getString(1); 
3 String password2 = resultSet.getString(1); 

做所有的行也會從數據庫讀取並存儲在ResultSet是執行的第一線時(換句話說,做第2和第3行只是輸出已經retreived值)?在SQLite android中,下列哪一行讀取數據?

或者是,將在線路以上的3

+1

2和3之間沒有區別 –

回答

2

沒有被存儲在密碼2從數據庫中讀取的數據。

Cursor resultSet = mydatbase.rawQuery("Select * from TutorialsPoint",null); 

此時,查詢還沒有被執行。它存儲在Cursor內。

String password1 = resultSet.getString(1); 

此時,執行查詢。您然後崩潰,因爲Cursor未定位在一排,因爲您沒有調用moveToFirst()或任何其他moveTo...()方法。

String password2 = resultSet.getString(1); 

此語句永遠不會被執行,由於上述崩潰。

換句話說,查詢是懶惰執行的。只有在Cursor上執行需要結果集的操作時,纔會執行查詢。這對於多線程開發來說是一個痛苦。

+0

如果SQL語句的結果包含數百萬行,並且需要很長時間才能從數據庫中完全讀取,那麼仍然可以調用cursor.moveToLast()並僅獲取最後一行? 我創建一個WhatsApp的應用程序(很多消息,但只檢索最新,除非需要) – SadeepDarshana

+1

@SadeepDarshana:「我仍然可以調用cursor.moveToLast()並只獲取最後一行嗎?」 - 沒有。 「我正在創建一個類似於WhatsApp的應用程序(很多消息,但只有在需要時纔會檢索最新消息)」 - 然後使用LIMIT和OFFSET以及更好的ORDER BY方向選擇來只檢索一個子集的行。 – CommonsWare

+1

@CommonsWare,不需要使用'LIMIT',因爲android中的Cursors是'窗口'的,也就是說,它們的數據量有限並根據需要填充自己。 –

相關問題