0

2 つのテーブルを持つデータベースがあります。テーブルにはいくつraw_dataかの列(緯度、経度、時間など)があり、resultsテーブルには の計算結果を保存したいのraw_dataですが、時間に基づいて計算したいのです。(=たとえば、今日の12:00から12:59までの行のみを取得し、それらを計算してresultsテーブルに保存したい)。LIKE 句を使用したかったのです。だから私はこのコードをLocations.java(データベースで作業しているクラス)で書きました:

public Cursor getLocationsByHour(String specificHour) 
    {
        SQLiteDatabase db = openHelper.getReadableDatabase();       
        return db.query(TABLE1_NAME, columns_T1, COLUMN_T1_TIMECEST_RAW + " LIKE '" + specificHour + "%'", null, null, null, null, null);}

どこ:

TABLE1_NAME is a protected static final String TABLE1_NAME = "raw_data";    
columns_T1 is a public static final String[] columns_T1 = {some columns names};
COLUMN_T1_TIMECEST_RAW is a public static final String COLUMN_T1_TIME_RAW = "time";    
specificHour is a i.e. 01. 06. 2013 12

getLocationsByHour()メソッドfillResultsTable()atから呼び出していLocations.javaます:

    public String fillResultsTable() 
        {
            String specificHour = "01. 06. 2013 12";  //hard coded for test purposes        
            String message;

            try {

                Cursor dbLocation = getLocationsByHour(specificHour);

                //HERE IS CODE WITH CALLING CALCULATIONS METHODS

                message = "OK";

            } catch (Exception e) {
                message = e.toString();         
            }
            return message;
        }

そして atメソッドToolsActivity.javaを呼び出しています。fillResultsTable()button1Click()

ただし、このコードはraw_data、特定の行ではなく、 からすべての行を返します。

私は何を間違えましたか?

PS: 私の英語で申し訳ありません。

4

1 に答える 1

0

あなたが書いたことから、私は COLUMN_T1_TIMECEST_RAW がstringであると仮定します。期待した内容が含まれていることを確認するためにデータをチェックしましたか?


(私が思うに) データが実際に長い値 (sqlite では整数として表されるミリ秒単位の時間) である場合、">" と "<" または "between" (および Calendar.getTimeInMillis()) を使用する必要があります。クエリを選択した範囲に制限します (LIKE は文字列比較専用です)

例えば:

private static final long DAY= 1000*60*60*24; // milliseconds in a day
Calendar mycal = new GregorianCalendar();
mycal.set(Calendar.HOUR, hour);
/* do day, month, minute, etc*/
 ....
long time = mycal.getTimeInMillis();
SQLiteDatabase db = openHelper.getReadableDatabase();       
String[] args = {Long.toString(time), Long.toString(time+DAY-1)}; // 24 hr - 1ms timespan
return db.query(TABLE1_NAME, columns_T1, COLUMN_T1_TIMECEST_RAW + " BETWEEN ? AND ?", args, null, null, null, null);}

また

return db.query(TABLE1_NAME, columns_T1, COLUMN_T1_TIMECEST_RAW + ">? AND "+COLUMN_T1_TIMECEST_RAW +"<?", args, null, null, null, null);}

COLUMN_T1_TIMECEST_RAW が実際に sqlite に文字列として格納されていて、これをさらに進めたい場合は、次のように投稿すると便利です。

a) 実際のテーブル定義コード b) データの一部 (数行)

また、私はお勧めします:

1) COLUMN_T1_TIMECEST_RAW を文字列として保持する場合。テーブルを FTS3 (ドキュメント) に変換し、MATCH を使用します

2) 1970年を超え2036年未満の時間範囲が時間を「エポックからのミリ秒」として保存し、それに応じてコードを調整する場合

3) 時刻を INTEGER YYYYMMDDHHmm (例: 201306011259) として保存し、201306010000 <= time < 201306012359 (m + h*100 + d*10000 + mon*1000000 + year*10000000) を比較します。MODULO と整数除算を使用してパーツを分離します

4) 時刻を REAL ( YYYYMMDD.frac ) として保存します。#3 とほぼ同じですが、効率が少し劣ります。

于 2013-06-01T16:59:12.610 に答える