我有一个包含多个列的数据库(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列。
我希望我的方式正确,有人可以帮助我。 提前谢谢!
答案 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 ifor(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;
}