2

我有一个包含几列的数据库(Android 上的 sqlite):_id、datum、hour、note

数据库是这样创建的:

    private static final String DATABASE_CREATE =
    "create table worked (_id integer primary key autoincrement, "
    + "datum text not null, hour text not null, " 
    + "note text);";

最后,我想从我的数据库中取出总小时数和分钟数,并将其返回给我的 mainActivity。

我试图这样做:

public int getTotalHours(){
    Cursor c = db.rawQuery("select hour from " + DATABASE_TABLE, null);
    int total = 0;
    Date hours = new Date();
    SimpleDateFormat hourFormat = new SimpleDateFormat("HH:mm");
    c.moveToFirst();
    for(int i = 0; i<c.getCount(); i++){
        String uur = c.getString(i);
        try {
            hours = hourFormat.parse(uur);
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        total += hours.getHours();
    }
    return total;
}

但是我的查询中已经出现错误。我也不知道如何以正确的方式提取数据,由于查询错误,我无法测试...

我得到的错误:

无法从具有 5 行 1 列的 cursorWindow 读取第 0 行第 1 列。

我希望我是在正确的方式,并且有人可以帮助我。提前致谢!

4

6 回答 6

1

正确循环您的记录,检索正确的列索引,然后关闭光标:

public int getTotalHours(){
    Cursor c = db.rawQuery("select hour from " + DATABASE_TABLE, null);
    if (c == null)
        return 0;

    try{
        int total = 0;
        Date hours = new Date();
        SimpleDateFormat hourFormat = new SimpleDateFormat("HH:mm");
        while(c.moveToNext())
        {
            String uur = c.getString(0);
            try {
                hours = hourFormat.parse(uur);
                total += hours.getHours();
            } catch (ParseException e) {
                e.printStackTrace();
            }           
        }

        return hours;
    }finally{
        c.close();
    }
}
于 2013-01-26T20:15:40.737 回答
0

采用

字符串 uur = c.getString(1);

于 2013-01-26T20:11:07.573 回答
0

在你的 for 循环中,从 1 而不是 0 开始你的 int i

for(int i = 1; i<c.getCount(); i++){
    String uur = c.getString(i);
    try {
        hours = hourFormat.parse(uur);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
于 2013-01-26T20:13:41.313 回答
0

首先,它是您正在创建的数据库中的一个表,因此我建议您改用CREATE_TABLE变量名。其次,您可以这样做:

Cursor c = db.rawQuery("select sum(hour) from " + DATABASE_TABLE, null);

在你的表中定义hour为整数。

如果您定义正确的列并使用正确的操作 sqlite 可以做到:

sqlite> .schema t1
CREATE TABLE t1 (hours time not null);
sqlite> select * from t1;
05:30:00
06:30:00
01:30:00
02:15:00
sqlite> select strftime('%H:%M', 946684800 + sum(strftime('%s', hours) - 946684800), 'unixepoch') from t1;
15:45
sqlite> 
于 2013-01-26T20:13:58.610 回答
0

在循环结束时调用 c.moveToNext() 会有所帮助。c.getString(i) 也应该是 c.getString(0)。

于 2013-01-26T20:15:10.377 回答
0

请确保小时行是 db 表中的第一个。如果您不确定此修改后的代码是否可以正常工作

enter code here
public int getTotalHours(){
Cursor c = db.rawQuery("select hour from " + DATABASE_TABLE, null);
int total = 0;
Date hours = new Date();
SimpleDateFormat hourFormat = new SimpleDateFormat("HH:mm");
c.moveToFirst();
int column = c.getColumnIndex("id")
for(int i = 0; i<c.getCount(); i++){
    String uur = c.getString(c);
    try {
        hours = hourFormat.parse(uur);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    total += hours.getHours();
}
return total;

}

于 2013-01-26T20:15:49.647 回答