6

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

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

这似乎暗示这个函数不应该与SELECT / INSERT / DELETE / UPDATE语句一起使用,但我有代码将它与插入一起使用并且可以工作。

我知道executeInsert其他方法,但executeUpdateDelete在我的 API 级别中不可用,所以我可以使用execute吗?

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

4

2 回答 2

3

execute可能不比 快executeInsert,甚至可能更慢(在 ICSexecute调用上executeUpdateDelete并丢弃返回值)。您需要对其进行测试,但我怀疑您会在这里找到真正的区别。

AFAIK,仅execute当您不需要返回值时使用它是安全的,但我不会指望在未来的 Android 版本中保持这种情况。文档说不,所以也许有人会改变行为以反映这一点。较旧的实现似乎execute也在使用(例如2.1 delete()sourcecode)。例如,果冻豆在 SQLite 的幕后发生了很大变化,但在使用时它应该仍然可以工作execute

此外,如果您不SQLiteStatement一遍又一遍地使用相同的参数,而只是重新绑定参数,则可能不值得使用它。与实际的数据库访问和所需的磁盘 I/O 相比,每次调用常规insert, , ... 方法时都构建一个新的方法要快。update另一方面,事务有很大帮助,因为在磁盘上为每个语句同步数据库状态真的很慢。

于 2012-11-13T17:54:42.817 回答
1

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

于 2012-11-13T18:08:16.587 回答