Android sqlite 查询没有返回它应该返回的内容
Android sqlite query not returning what it should
这已经困扰我一段时间了,我似乎无法弄明白。
我正在使用日历,当单击某一天时,我将调用包含当天事件并为每个事件绘制标记的地图。
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
Bundle extras = getIntent().getExtras();
String date_clicked = extras.getString("PASSED_DATE");
title.setText(date_clicked);
dbHelper helper = new dbHelper(getApplicationContext());
Cursor cursor = helper.getAllEventsByDay(this, date_clicked);
Log.d("MapsActivity", "date_clicked " + date_clicked);
if (cursor.moveToFirst())
{
do {
String row_loc = cursor.getString(0);
String row_title = cursor.getString(1);
Log.d("DayEvents", "row_loc " + row_loc);
if (!row_loc.isEmpty()) {
LatLng hcmus = getLocationFromAddress(getApplicationContext(), row_loc);
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(hcmus, 18));
originMarkers.add(mMap.addMarker(new MarkerOptions()
.title(row_title)
.position(hcmus)));
}
}while(cursor.moveToNext());
}
mMap.setMyLocationEnabled(true);
}
我在这个月的 X 天在数据库中有几个事件在同一天开始和结束。
有趣的是,当我在查询中使用 AND 运算符时,地图现在会显示点击日期的那些事件,但是当我用 OR 代替 AND 时,地图会显示每天的所有事件。
那么问题出在哪里呢?查询应该是正确的,例如,如果我在第 18 天有事件持续到同一个 18 日,它看起来像这样:where start_date<=2016-05-18 AND end_date>=2016-05-18
因此应该 return 那天的所有事件,而不是从数据库中获取任何内容...
dbHelper.java
光标:
public Cursor getAllEventsByDay(Activity activity,String date) {
SQLiteDatabase db = getReadableDatabase();
String from[] = { eventai.InsertNewEvent.LOCATION, eventai.InsertNewEvent.EVENT, eventai.InsertNewEvent.START_TIME};
String where = eventai.InsertNewEvent.START_DATE+" <= "+date+" AND "+eventai.InsertNewEvent.END_DATE+">= "+date;
Cursor cursor = db.query(eventai.InsertNewEvent.TABLE_NAME, from, where, null, null, null, null, null);
Log.d("MapsActivity", "CURSOR " + from + where);
return cursor;
}
我需要提到我所有的数据库字段都是文本,我得到的日期格式 String date
是 yyyy-MM-dd,数据库字段也是如此 START_DATE
和END_DATE
.
这实际上应该是评论。但我没有足够的代表发表评论。所以发布这个作为答案。
尝试将 where 子句更改为
eventai.InsertNewEvent.START_DATE+" >= "+date+" AND "+eventai.InsertNewEvent.END_DATE+" <= "+date;
来自
eventai.InsertNewEvent.START_DATE+" <= "+date+" AND "+eventai.InsertNewEvent.END_DATE+">= "+date;
所以我在这里缺少单引号,所以解决方案如下:
eventai.InsertNewEvent.START_DATE+" <= '"+date+"' AND "+eventai.InsertNewEvent.END_DATE+" >= '"+date+"'";
但这不是一个完整的解决方案...我只得到行,其中 start_date < 日期和 end_date > 日期,但我没有得到日期等于开始日期和结束日期的行...
这已经困扰我一段时间了,我似乎无法弄明白。
我正在使用日历,当单击某一天时,我将调用包含当天事件并为每个事件绘制标记的地图。
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
Bundle extras = getIntent().getExtras();
String date_clicked = extras.getString("PASSED_DATE");
title.setText(date_clicked);
dbHelper helper = new dbHelper(getApplicationContext());
Cursor cursor = helper.getAllEventsByDay(this, date_clicked);
Log.d("MapsActivity", "date_clicked " + date_clicked);
if (cursor.moveToFirst())
{
do {
String row_loc = cursor.getString(0);
String row_title = cursor.getString(1);
Log.d("DayEvents", "row_loc " + row_loc);
if (!row_loc.isEmpty()) {
LatLng hcmus = getLocationFromAddress(getApplicationContext(), row_loc);
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(hcmus, 18));
originMarkers.add(mMap.addMarker(new MarkerOptions()
.title(row_title)
.position(hcmus)));
}
}while(cursor.moveToNext());
}
mMap.setMyLocationEnabled(true);
}
我在这个月的 X 天在数据库中有几个事件在同一天开始和结束。
有趣的是,当我在查询中使用 AND 运算符时,地图现在会显示点击日期的那些事件,但是当我用 OR 代替 AND 时,地图会显示每天的所有事件。
那么问题出在哪里呢?查询应该是正确的,例如,如果我在第 18 天有事件持续到同一个 18 日,它看起来像这样:where start_date<=2016-05-18 AND end_date>=2016-05-18
因此应该 return 那天的所有事件,而不是从数据库中获取任何内容...
dbHelper.java
光标:
public Cursor getAllEventsByDay(Activity activity,String date) {
SQLiteDatabase db = getReadableDatabase();
String from[] = { eventai.InsertNewEvent.LOCATION, eventai.InsertNewEvent.EVENT, eventai.InsertNewEvent.START_TIME};
String where = eventai.InsertNewEvent.START_DATE+" <= "+date+" AND "+eventai.InsertNewEvent.END_DATE+">= "+date;
Cursor cursor = db.query(eventai.InsertNewEvent.TABLE_NAME, from, where, null, null, null, null, null);
Log.d("MapsActivity", "CURSOR " + from + where);
return cursor;
}
我需要提到我所有的数据库字段都是文本,我得到的日期格式 String date
是 yyyy-MM-dd,数据库字段也是如此 START_DATE
和END_DATE
.
这实际上应该是评论。但我没有足够的代表发表评论。所以发布这个作为答案。
尝试将 where 子句更改为
eventai.InsertNewEvent.START_DATE+" >= "+date+" AND "+eventai.InsertNewEvent.END_DATE+" <= "+date;
来自
eventai.InsertNewEvent.START_DATE+" <= "+date+" AND "+eventai.InsertNewEvent.END_DATE+">= "+date;
所以我在这里缺少单引号,所以解决方案如下:
eventai.InsertNewEvent.START_DATE+" <= '"+date+"' AND "+eventai.InsertNewEvent.END_DATE+" >= '"+date+"'";
但这不是一个完整的解决方案...我只得到行,其中 start_date < 日期和 end_date > 日期,但我没有得到日期等于开始日期和结束日期的行...