在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等等。
  • PRAGMA table_info这样的以行的forms返回数据的特殊情况(参见这个问题 )
  • 注意:不要使用rawQuery来进行INSERTUPDATEDELETE或其他任何修改数据库的操作。 你会遇到“为什么删除rawQuery需要moveToFirst才能真正删除行?” 。 原因是查询可以推迟读取结果直到需要(=访问游标),这意味着SQLite推迟执行语句 。

用于execSQL是:

  • 你有数据库的“说明”。 像CREATE TABLE (或任何其他CREATE语句,例如CREATE INDEX ), DROPPRAGMA设置属性而不是返回它们,…
  • INSERTUPDATEDELETE当您对修改的行数或最后一个插入的行ID不感兴趣时​​。
    • 当你需要的时候,可以使用update()insert()delete()方法或者使用第二个语句来读取这些: DatabaseUtils.longForQuery ,其中包括SELECT last_insert_rowid()SELECT changes() 。 两者都只返回1个整数值。 (请参阅“使用原始查询从Android中的SQLite获取更新的行数”和“SELECT last_insert_rowid()”始终返回“0” )
  • 还有一些依赖于执行语句的东西。

如果你想在数据库中执行某些东西而不关心它的输出(例如创build/修改表),那么使用execSQL ,但是如果你希望返回一些结果作为你的查询(例如selectlogging),那么使用rawQuery