从sqlite数据库中获取全部内容

时间:2013-01-26 20:08:51

标签: android database sqlite

我有一个包含多个列的数据库(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列。

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

6 个答案:

答案 0 :(得分: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();
    }
}

答案 1 :(得分:0)

使用

String uur = c.getString(1);

答案 2 :(得分: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();
    }

答案 3 :(得分: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> 

答案 4 :(得分:0)

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

答案 5 :(得分: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;

}