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()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;
        }

ToolsActivity.java我打电话给fillResultsTable()方法button1Click()

但是此代码从 中返回所有行raw_data,而不是特定行。

我做错了什么?

PS:对不起我的英语。

4

1 回答 1

0

根据您所写的,我假设 COLUMN_T1_TIMECEST_RAW 是一个字符串。你检查过数据以确保它包含你所期望的吗?


如果(我怀疑)数据实际上是一个长值(以毫秒为单位的时间,在 sqlite 中表示为整数),则需要使用“>”和“<”或“介于”(以及 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) 将时间存储为整数 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 回答