在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