Android SQLite使用LIKE子句获取特定行

时间:2013-06-01 16:25:37

标签: android sqlite

我有一个包含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:对不起我的英文。

1 个答案:

答案 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相同但效率稍低恕我直言