在查询超过几千个结果时,android中的Ormlite DAO变得非常慢

时间:2011-10-18 17:45:38

标签: android performance dao ormlite

当有几千个结果时,通过Ormlite DAO查询数据时出现问题。

代码:

List<Point> pl = db.getPointsDAO().queryBuilder().where().
            eq("route_id", croute).query();

当我想获得当前路线List<Point> pl的大量分数croute时,我必须等待40秒才能获得40.000分。

其中Point.class是:

@DatabaseTable(tableName = "points")
public class Point extends BaseEntity {
    @DatabaseField(generatedId = true)
    private Integer point_id;
    @DatabaseField(canBeNull = false)
    ...
    @DatabaseField(canBeNull = false)
    private Double dose;
    @DatabaseField(dataType=DataType.DATE_STRING, format="yyyy-MM-dd HH:mm:ss")
    public Date date;
    @DatabaseField(canBeNull=true,foreign=true)
    private Route route;

public Point() {
    super();
};
... ...
}

和Route.class是:

@DatabaseTable(tableName = "routes")
public class Route extends BaseEntity {

    @DatabaseField(generatedId = true)
    private Integer route_id;

    @DatabaseField(canBeNull = true)
    private String name;

    @ForeignCollectionField(eager = false)
    ForeignCollection<Point> points;

    public Route() {
        super();
    }
    ... ...
}

一些想法我做错了什么?

谢谢, 托尼

1 个答案:

答案 0 :(得分:2)

要尝试@toni的事情。

  1. 我会考虑将您的Date存储为DATE_LONG而不是字符串,这样可以节省40k字符串/日期转换次数。
  2. @Selvin是对的,如果有一些方法可以遍历数据库,这可能会降低您的内存需求并加快速度。请参阅dao.iterator()中的ORMLite
  3. 我会使用intdouble原语降低每个对象的GC,但我怀疑它会产生很大的不同。
  4. 尝试加载1000点,然后10000点,然后点击20000,以查看某点是否有性能下降。这将告诉你,你正在达到内存限制。
  5. 使用adb logcat实用程序查看您是否可以查看GC时间,看看您是否只是在掠夺收集器。您可以采取任何措施来降低内存使用量。查找以下行:
    GC_EXPLICIT freed 4140 objects / 216560 bytes in 114ms
  6. 虽然我怀疑这是个问题,你能不能错过索引?尝试在外部index = true字段中添加route