使用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
,PRAGMA
s设置属性而不是返回它们,...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 次 |
最近记录: |