【发布时间】:2012-03-12 12:30:01
【问题描述】:
使用 rawquery 和 execSQL 之间的确切区别是什么? 在android活动中编写查询时,何时使用rawquery以及何时使用execSQL?
【问题讨论】:
使用 rawquery 和 execSQL 之间的确切区别是什么? 在android活动中编写查询时,何时使用rawquery以及何时使用execSQL?
【问题讨论】:
来自 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(...)) - 这会跳过创建 @ 987654343@ object & 简化了代码,因为也没有什么可以关闭、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、PRAGMAs 设置属性而不是返回它们,...INSERT、UPDATE 或 DELETE 当您对修改的行数或最后插入的行 ID 不感兴趣时。
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”)【讨论】:
如果您想在数据库中执行某些操作而不考虑其输出(例如创建/更改表),那么请使用 execSQL,但如果您希望针对您的查询返回一些结果(例如选择记录) 然后使用 rawQuery
【讨论】: