使用rawquery和execSQL之间的确切区别是什么?在android活动中编写查询时,何时使用rawquery以及何时使用execSQL?
zap*_*apl 84
从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(...)只有1x1的查询结果,比如from SELECT count(*) FROM table(它也有自己的专用方法DatabaseUtils.queryNumEntries(...):) - 这会跳过Cursor对象的创建并简化代码,因为也没有什么可以关闭,moveToNext等等.PRAGMA table_info这样的特殊情况会返回行中的数据(请参阅此问题) rawQuery的INSERT,UPDATE或DELETE或其他任何修改数据库.您将遇到"为什么删除rawQuery需要moveToFirst才能实际删除行?" .原因是查询可以推迟读取结果直到需要(=访问游标),这意味着SQLite延迟执行语句.用途execSQL是:
CREATE TABLE(或任何其他CREATE声明,例如CREATE INDEX)DROP,PRAGMAs设置属性而不是返回它们,...INSERT,UPDATE或者DELETE 当您对修改的行数或最后一个插入的行ID不感兴趣时.
update(),insert(),delete()方法或使用第二个语句来读取这些:DatabaseUtils.longForQuery具有两种SELECT last_insert_rowid()或SELECT changes().两者都只返回1个整数值.(请参阅"使用原始查询从Android中的SQLite获取更新的行数?"和"SELECT last_insert_rowid()"始终返回"0")waq*_*lam 12
如果你想在数据库中执行一些事情而不考虑它的输出(例如create/alter tables),那么使用execSQL,但如果你期望一些结果反过来你的查询(例如选择记录),那么使用rawQuery
| 归档时间: |
|
| 查看次数: |
33466 次 |
| 最近记录: |