使用rawquery和execSQL之间的确切区别是什么? 在android活动中编写查询时,何时使用rawquery以及何时使用execSQL?
答案 0 :(得分:80)
来自API文档:
执行一个非SELECT的SQL语句或任何其他返回数据的SQL语句。
void execSQL (String sql, Object[] bindArgs)
执行一个非SELECT / INSERT / UPDATE / DELETE的SQL语句。
文档不一致,但它们的行为都相同。后者的文档更深入。
Cursor rawQuery (String sql, String[] selectionArgs)
运行提供的SQL并在结果集上返回一个Cursor。
rawQuery
的用途是:
SELECT
语句查询数据库
=> rawQuery("SELECT ...
会在Cursor
中返回一组行和列。
DatabaseUtils.longForQuery(SQLiteDatabase, String, String[])
或DatabaseUtils.stringForQuery(...)
效率更高,例如来自SELECT count(*) FROM table
(也有自己的专用方法:DatabaseUtils.queryNumEntries(...)
) - 这会跳过创建Cursor
对象&简化代码,因为也没有什么可以关闭,moveToNext等。PRAGMA table_info
等特殊情况,可以按行返回数据(请参阅this question)rawQuery
,INSERT
或UPDATE
或其他修改数据库的内容使用DELETE
。你会遇到"Why does a delete rawQuery need a moveToFirst in order to actually delete the rows?"。原因是查询可以推迟读取结果直到需要(=访问游标),这意味着SQLite延迟execution of the statement。 execSQL
的用途是:
CREATE TABLE
(或任何其他CREATE
语句(例如CREATE INDEX
),DROP
,PRAGMA
设置属性而非返回它们一样,... INSERT
,UPDATE
或DELETE
。
update()
,insert()
,delete()
方法或使用第二个语句来阅读DatabaseUtils.longForQuery
SELECT last_insert_rowid()
或SELECT changes()
。两者都只返回1个整数值。 (请参阅"Get updated rows count from SQLite in Android using a raw query?"和“SELECT last_insert_rowid()” returns always “0”)答案 1 :(得分:10)
如果你想在数据库中执行一些事情而不考虑它的输出(例如创建/改变表),那么使用 execSQL ,但是如果你期望某些结果反对你的查询(例如选择记录) )然后使用 rawQuery