2

_id、datum、hour、note という複数の列を持つデータベース (Android では sqlite) があります。

データベースは次のように作成されます。

    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 列のカーソルウィンドウから行 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

ループの最後で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 に答える
0

使用する

文字列 uur = c.getString(1);

于 2013-01-26T20:11:07.573 に答える
0

for ループで、 int i を 0 ではなく 1 から開始します

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 に答える