在android sqlite数据库中的rawquery和execSQL之间的区别
什么是使用rawquery和execSQL之间的确切区别? 在android活动中编写查询时,何时使用rawquery以及何时使用execSQL?
从API文档:
void execSQL (String sql)
执行不是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
一组行和列。- 在只有1×1查询结果的情况下使用
DatabaseUtils.longForQuery(SQLiteDatabase, String, String[])
或DatabaseUtils.stringForQuery(...)
更有效率,比如SELECT count(*) FROM table
(它也有自己的专用方法:DatabaseUtils.queryNumEntries(...)
) – 这会跳过创build一个Cursor
对象并简化代码,因为还没有closures,moveToNext等等。
- 在只有1×1查询结果的情况下使用
- 像
PRAGMA table_info
这样的以行的forms返回数据的特殊情况(参见这个问题 ) - 注意:不要使用
rawQuery
来进行INSERT
,UPDATE
或DELETE
或其他任何修改数据库的操作。 你会遇到“为什么删除rawQuery需要moveToFirst才能真正删除行?” 。 原因是查询可以推迟读取结果直到需要(=访问游标),这意味着SQLite推迟执行语句 。
用于execSQL
是:
- 你有数据库的“说明”。 像
CREATE TABLE
(或任何其他CREATE
语句,例如CREATE INDEX
),DROP
,PRAGMA
设置属性而不是返回它们,… -
INSERT
,UPDATE
或DELETE
当您对修改的行数或最后一个插入的行ID不感兴趣时。- 当你需要的时候,可以使用
update()
,insert()
,delete()
方法或者使用第二个语句来读取这些:DatabaseUtils.longForQuery
,其中包括SELECT last_insert_rowid()
或SELECT changes()
。 两者都只返回1个整数值。 (请参阅“使用原始查询从Android中的SQLite获取更新的行数”和“SELECT last_insert_rowid()”始终返回“0” )
- 当你需要的时候,可以使用
- 还有一些依赖于执行语句的东西。
如果你想在数据库中执行某些东西而不关心它的输出(例如创build/修改表),那么使用execSQL ,但是如果你希望返回一些结果作为你的查询(例如selectlogging),那么使用rawQuery