SqliteDatabase Handler - 为什么第一次写查询比其他查询花费的时间更长

时间:2014-10-06 09:37:45

标签: android database sqlite time

我有一个带数据库的应用程序。

它只被Application类调用一次,然后引用转发给任何需要它的人。初始化后,我调用db = this.getWritableDatabase();并将其保持打开状态。虽然简单Double的每次写入操作大约需要6-10 ms,但是第三次​​写入操作需要30-50 ms,最长可达8倍。

那是怎么来的?是初始化吗?我以为调用getWritableDatabase()会为我初始化一切吗?还是有其他原因吗?我可以在某处阅读它,为什么以及如何表现?

提前致谢

编辑:为了使这一点更清楚:在数据库处理程序初始化之后,值会被写入,因此初始化将会很长时间。

编辑2:现在我深入研究了这个主题,我找到了两件事:

  1. 据说对未编制索引的表的查询会更慢。这总是如此吗?没有android创建索引,如sqlite_autoindex_tablename_1。没解决这个问题?
  2. getWritableDatabase()实际上没有打开任何东西,只是在执行第一个游标操作(如cursor.move())时它真的被加载了?这是对的吗?

1 个答案:

答案 0 :(得分:0)

public SQLiteDatabase getWritableDatabase ()

创建和/或打开将用于读写的数据库。第一次调用它时,数据库将被打开并

 onCreate(SQLiteDatabase), 
 onUpgrade(SQLiteDatabase, int, int) and/or 
 onOpen(SQLiteDatabase) will be called.

成功打开后,数据库将被缓存,因此您可以在每次需要写入数据库时​​调用此方法。 (确保在不再需要数据库时调用close()。)

错误权限或完整磁盘等错误可能导致此方法失败,但如果问题得到解决,将来的尝试可能会成功。

数据库升级可能需要很长时间,您不应该从应用程序主线程调用此方法,包括来自ContentProvider.onCreate()。 返回

读取/写入数据库对象有效,直到调用close()

Throws

 SQLiteException    if the database cannot be opened for writing.

我希望这对你有所帮助。