使用queryForAll()的Android ORMlite性能问题

时间:2012-09-27 09:17:27

标签: android ormlite performance

好吧,就像标题所说的那样,我在使用ormLite在DAO对象上执行queryForAll时遇到了一些性能问题(如果它很重要的话,还有android)。

我实际上唯一要做的就是执行此操作:

  

this.getHelper()getActivityDao()queryForAll()。; (其中this.getHelper()返回从OrmLiteSqliteOpenHelper类扩展的database-helper)

这一行实际上需要大约14秒来执行...好吧,“Activity”实体有大约80个字段,queryForAll返回一个长度为74个对象的数组,但仍然 - 这不正常,可以吗?

(对于我使用

的日历字段
  

@DatabaseField(dataType = DataType.SERIALIZABLE)

注释,我不确定,如果这是日历字段的正确注释,或者它是否会导致性能问题......)

2 个答案:

答案 0 :(得分:3)

  

这一行实际上需要大约14秒来执行...好吧,“Activity”实体有大约80个字段,queryForAll返回一个长度为74个对象的数组,但仍然 - 这不正常,可以吗?

queryForAll()不应该花费很长时间,除非你可能怀疑,你的表中有一些个对象 - 或者每个对象中有大量数据。在这种情况下,queryForAll()必须基本上转储整个表并创建大量对象。

对于较大的查询,建议使用迭代器而不是转储整个表:

  

http://ormlite.com/docs/iterator

例如,您可以像这样运行查询中的所有对象:

// page through all of the accounts in the database
for (Account account : accountDao) {
   // do something with each account here
}

答案 1 :(得分:1)

您的课程中是否有使用ORM自动刷新的外来对象或集合?这样,我的意思是用foreignAutoRefresh = true注释的成员或用@ForeignCollectionField(eager = true)注释的集合。这些注释将代表您执行更多查询。

如果是这种情况,您可能无意中撤回了比您想象的更多的数据。在这种情况下,我会使用queryRaw()并手动编写连接语句以获取所需数据。