SQLiteStatement执行SELECT / INSERT / DELETE / UPDATE

时间:2012-11-13 17:23:22

标签: android sqlite android-sqlite

我正在使用已编译的SQLiteStatement来优化SQLite事务,但我正在阅读execute函数的文档:

  

执行此SQL语句,如果它不是SELECT / INSERT / DELETE / UPDATE ,例如CREATE / DROP表,视图,触发器,索引等。

这似乎意味着这个函数不应该与SELECT / INSERT / DELETE / UPDATE语句一起使用,但是我有一些代码可以使用它与插入一起工作。

我知道executeInsert和其他方法,但我的API级别无法使用executeUpdateDelete,因此我可以使用execute吗?

此外,如果我不需要最后一个插入ID或受影响的行数,我应该使用execute而不是executeInsert等等,换句话说,它是否更有效?

2 个答案:

答案 0 :(得分:3)

execute可能不会比executeInsert快,甚至可能更慢(在ICS execute调用executeUpdateDelete并丢弃返回值)。你需要测试一下,但我怀疑你会发现真正的不同。

AFAIK,如果你不需要返回值,那么只使用execute是安全的,但我不会指望在未来的Android版本中保持为真。文档说不,所以也许有人会改变行为来反映这一点。较旧的实现似乎也使用execute(例如2.1 delete() sourcecode)。例如,Jelly Bean在SQLite的幕后更改了a lot,但在使用execute

时它仍然可以工作

此外,如果你不重复使用相同的SQLiteStatement而重新绑定args,则可能不值得使用它。每次调用常规insertupdate,...方法时,建立一个新方法与实际数据库访问和所需的磁盘I / O相比是快速的。另一方面,事务有很多帮助,因为在磁盘上为每个语句同步数据库状态实际上很慢。

答案 1 :(得分:1)

使用SQLiteDatabase代替SQLiteStatement与您的数据库进行交互。 SQLiteStatements不是线程安全的,所以我不会将它们用于SELECT / INSERT / DELETE / UPDATE。此外,您应该尝试不将原始数据库查询用于Selects以外的任何其他内容。内置的辅助函数可以提高数据库性能。在SQLiteDatabase的实例上,你有.insert,.update,.delete和我使用.rawQuery进行选择。