我正在使用已编译的SQLiteStatement
来优化SQLite事务,但我正在阅读execute
函数的文档:
执行此SQL语句,如果它不是SELECT / INSERT / DELETE / UPDATE ,例如CREATE / DROP表,视图,触发器,索引等。
这似乎意味着这个函数不应该与SELECT / INSERT / DELETE / UPDATE
语句一起使用,但是我有一些代码可以使用它与插入一起工作。
我知道executeInsert
和其他方法,但我的API级别无法使用executeUpdateDelete
,因此我可以使用execute
吗?
此外,如果我不需要最后一个插入ID或受影响的行数,我应该使用execute
而不是executeInsert
等等,换句话说,它是否更有效?
答案 0 :(得分:3)
execute
可能不会比executeInsert
快,甚至可能更慢(在ICS execute
调用executeUpdateDelete
并丢弃返回值)。你需要测试一下,但我怀疑你会发现真正的不同。
AFAIK,如果你不需要返回值,那么只使用execute
是安全的,但我不会指望在未来的Android版本中保持为真。文档说不,所以也许有人会改变行为来反映这一点。较旧的实现似乎也使用execute
(例如2.1 delete()
sourcecode)。例如,Jelly Bean在SQLite的幕后更改了a lot,但在使用execute
此外,如果你不重复使用相同的SQLiteStatement
而重新绑定args,则可能不值得使用它。每次调用常规insert
,update
,...方法时,建立一个新方法与实际数据库访问和所需的磁盘I / O相比是快速的。另一方面,事务有很多帮助,因为在磁盘上为每个语句同步数据库状态实际上很慢。
答案 1 :(得分:1)
使用SQLiteDatabase代替SQLiteStatement与您的数据库进行交互。 SQLiteStatements不是线程安全的,所以我不会将它们用于SELECT / INSERT / DELETE / UPDATE。此外,您应该尝试不将原始数据库查询用于Selects
以外的任何其他内容。内置的辅助函数可以提高数据库性能。在SQLiteDatabase
的实例上,你有.insert,.update,.delete和我使用.rawQuery进行选择。