Java 在一周的时间跨度内按每天的时间戳聚合对象

Java 在一周的时间跨度内按每天的时间戳聚合对象,java,android,sql,loops,jodatime,Java,Android,Sql,Loops,Jodatime,在一周的时间跨度内,我无法根据每天的时间戳聚合数据。有一个SQLite数据库,它有一个表,我将行走步数保存在该表中(timestamp列是UTC,created_At是本地时间,但我不使用created_At列) 我想做的是得到7天前到前一天午夜发生的全部数据。所以我用这个jodatime表达式来查找时间戳的开始和结束 long start = new DateTime().withMillisOfDay(0).minusDays(7).getMillis(); long end = new

在一周的时间跨度内,我无法根据每天的时间戳聚合数据。有一个SQLite数据库,它有一个表,我将行走步数保存在该表中(
timestamp
列是UTC,
created_At
是本地时间,但我不使用created_At列)

我想做的是得到7天前到前一天午夜发生的全部数据。所以我用这个
jodatime
表达式来查找时间戳的开始和结束

long start = new DateTime().withMillisOfDay(0).minusDays(7).getMillis();
long end = new DateTime().withTimeAtStartOfDay().getMillis();
//start milli:1405029600000 DateTime: 2014-07-11 00:00:00
//end milli:1405634400000   DateTime: 2014-07-18 00:00:00
然后执行以下sql命令:

SELECT * FROM pa_data WHERE timestamp BETWEEN 1405029600000 AND 1405634400000
我非常确定它返回了正确的行数(我已经将android数据库结果与我电脑上的SQLite数据库浏览器进行了比较,两者返回的行数相同)。为此,我尝试使用此嵌套迭代:

我尝试创建的对象是:

public class PhysicalActivityPerDay {

    private List<PhysicalActivity> mList;

    public PhysicalActivityPerDay(List<PhysicalActivity> list) {
        mList = new ArrayList<PhysicalActivity>(list);
    }

    //methods....

}
但是,当我检查
all
列表(DB返回的总行数)时,尽管我正在从列表中删除匹配的对象,但如果我在嵌套迭代后查询其大小,它仍然意外地包含许多对象,告诉我迭代没有成功

//Remaining: 3278 records after iterations from 6559

我做错了什么?请帮我找到

不确定这是否是唯一的问题:

您正在
all
列表上循环,并删除项目。 当您调用
all.remove(j)
时,以前位于位置j+1的项目将移动到位置j。这意味着您的for循环将跳过该项

解决此问题的一种方法是仅在不从列表中删除项目时增加j

for (int j = 0; j < all.size();) {

    PhysicalActivity p = all.get(j);
    DateTime when = new DateTime(p.getTimestamp());

    if (when.isAfter(start) && when.isBefore(stop)) {
        tempList.add(p);
        all.remove(j); //remove the matching object from the list
    } else {
        j++;
    }
}
请参阅:

公共E删除(int索引)

删除此列表中指定位置的元素将任何后续元素向左移动(从其索引中减去一个)


让SQL为您执行聚合怎么样

    SELECT strftime('%W-%Y',dt) as weekYear, count(1) as occurencePerWeek 
    FROM SOMETABLE c GROUP BY weekYear;

非常感谢!这就是问题所在!请您也谈谈您对代码性能的看法,它能更好吗?它的SQLite我不确定它是否有这个特性是的。单击SQLFIDLE链接,我使用了SQLlite引擎。
for (int j = 0; j < all.size();) {

    PhysicalActivity p = all.get(j);
    DateTime when = new DateTime(p.getTimestamp());

    if (when.isAfter(start) && when.isBefore(stop)) {
        tempList.add(p);
        all.remove(j); //remove the matching object from the list
    } else {
        j++;
    }
}
Iterator<PhysicalActivity> iter = all.iterator();
while (iter.hasNext ()) {
  PhysicalActivity p = iter.next();
  ...
  if (...) {
    iter.remove();
  }
}
    SELECT strftime('%W-%Y',dt) as weekYear, count(1) as occurencePerWeek 
    FROM SOMETABLE c GROUP BY weekYear;