2011-08-30 39 views
0

目前我正在尝试将db4o整合到我的应用程序中。我有一个模型包含 - 可以说15个基元 - 包装在其他对象中。存储他们是容易和快速的,但接受他们是痛苦。我尝试了NativeQuerys和SODA,没有太大区别。为了给它们中的一些索引减慢查询甚至更多。Android上的缓慢db4o查询

实施例中:我有一个查询看起来像这样:上述我希望recievce像存储100所报告的40

public static class DatabaseScheduleReportTimeComparator implements Comparator<DatabaseReport>{ 

    @Override 
    public int compare(DatabaseReport object1, 
      DatabaseReport object2) { 

     long first = object1.getReport().getBegin().getMillis(); 
     long second = object2.getReport().getBegin().getMillis(); 
     if (first < second) return 1; 
     if (first > second) return -1; 
     else { 
      first = object1.getReport().getEnd().getMillis(); 
      second = object2.getReport().getEnd().getMillis(); 
      if (first > second) return 1; 
      if (first < second) return -1; 
      else return 0; 
     } 
使用查询

这样:

public List<DatabaseReport> getCurrentDeviationReportsOnly(){ 
    final long now = System.currentTimeMillis(); 
    return getDatabase().query(new Predicate<DatabaseReport>() { 
     @Override 
     public boolean match(DatabaseReport candidate) { 
      return candidate.getReport().getBegin().getMillis() < now 
       && candidate.getReport().getEnd().getMillis() > now; 
     } 
    }, mTimeComparator); 

mTimeComparator被实现为以下。我测量了查询和激活的时间,其约3,5秒!!!对我来说,这看起来非常慢! 我玩了一会儿,并在我的查询中删除了比较器。现在我的执行时间大约为1,2秒。如果我用Collections.sort(myInstantiatedDatabaseReportList, mTimeComparator)手动对它们进行排序,它将在47 Millis中执行!难道我做错了什么? db4o喜欢比Collections.sort()多10倍以上的原因是什么?

为db4o优化我的模型的最佳方法是什么? (激活的不是在这种情况下有用,因为ResultingList将在ListAdapter,这就需要每一个成员通过。)

编辑:由于下面的答案,我在这里插入我的SodaQuery,太:

public List<DatabaseReport> getCurrentDeviationReports(){ 
    final Date now = new Date(System.currentTimeMillis()); 

    Query query = getDatabase().query(); 
    query.constrain(DatabaseReport.class); 
    query.descend("mReport").descend("begin").descend("datetime").constrain(now).smaller(); 
    query.descend("mReport").descend("end").descend("datetime").constrain(now).greater(); 
    query.descend("mReport").descend("begin").descend("datetime").orderAscending(); 
    query.descend("mReport").descend("end").descend("datetime").orderDescending(); 
    return query.execute(); 

} 

所以这里的“datetime”是一个java.util.date对象。正如我上面写的,在我看来,索引使它变得更加松弛!

+0

也许您应该在相关字段中添加索引? –

回答

3

有很多事情可能会出错。所以这是我的检查清单。

  • 确保沿着这个导航每个字段建立索引。 '报告','开始'字段和'毫米'字段。
  • 这些字段中的任何一个是接口还是泛型?然后db4o将不会使用索引。您需要具体类型,以便db4o可以找出该字段的类型并使用索引。
  • 当你在Android上使用本机查询时,不是那么那么你需要optimize these at built time。原因是查询优化器无法处理
  • getBegin()返回的类型是什么?如果它是一个普通的Java日期,那么本机优化器不会比比较更大/更小。这只适用于SODA
  • 查询返回40个100对象?那么排序不应该是一个大问题。
  • SODA也很慢?那有点奇怪。你可以告诉我你的SODA查询吗?