2017-06-16 40 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是'窗口'的,也就是说,它们的数据量有限并根据需要填充自己。 –

相关问题