我有一个包含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
。
但是此代码返回{{1}}中的所有行,而不是特定行。
我做错了什么?
PS:对不起我的英文。
答案 0 :(得分: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);}
OR
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(documentation)并使用MATCH
2)如果您的时间范围&gt; 1970和&lt; 2036将时间存储为&#34;自纪元以来的毫秒数&#34;并相应调整代码
3)将时间存储为INTEGER YYYYMMDDHHmm,例如201306011259,并比较201306010000&lt; = time&lt; 201306012359(m + h * 100 + d * 10000 + mon * 1000000 +年* 10000000)。使用MODULO和整数除法来分离出部分
4)将时间存储为REAL(YYYYMMDD.frac)或多或少与#3相同但效率稍低恕我直言