我正在尝试从sqlite中获取数据以将它们设置为微调器。用户创建行日期行并将其设置到数据库中(COLUMN_DATE_DEPART)。 在第一个微调器中,我想获得COLUMN_DATE_DEPART中存在的年份列表。 在第二个中,我想获得在第一个微调器中选择的一年中的月份列表。
问题如下:在第一个微调器中,我得到了预期的年份。在第二个微调器中,我获得了几个月,但是如果用户在1月1日和1月31日创建了两次旅行,那么我将在1月份进行两次而不是一次。
我的问题是:我错过了什么?
查找附上我的代码。
片段活动Java
List<String> an = helper.ListeAnneeTrajet(et_iduser);
final ArrayAdapter<String> adapterA= new ArrayAdapter<>(this.getActivity(), R.layout.spinner_item, an);
adapterA.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
annee.setAdapter(adapterA);
annee.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
List<String> mo = helper.ListeMoisTrajet(et_iduser, annee.getSelectedItem().toString().trim());
ArrayAdapter<String> adapterB = new ArrayAdapter<>(getActivity(), R.layout.spinner_item, mo);
adapterA.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mois.setAdapter(adapterB);
mois.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
// your code here
}
@Override
public void onNothingSelected(AdapterView<?> parentView) {
// your code here
}
});
}
@Override
public void onNothingSelected(AdapterView<?> parentView) {
// your code here
}
});
DatabaseHelper
public List<String> ListeAnneeTrajet(String et_iduser) {
List<String> an = new ArrayList<>();
String selectQuery = "SELECT DISTINCT * FROM " + TABLE_NAME3 + " WHERE (" + COLUMN_ID_CHAUFFEUR + " = '" + et_iduser + "' AND " + COLUMN_DATE_DEPART + " >= DATE('NOW')) GROUP BY SUBSTR(" + COLUMN_DATE_DEPART + ",1,4) ORDER BY " + COLUMN_DATE_DEPART + " ASC";
db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
if (cursor.moveToFirst()) {
do {
an.add(cursor.getString(cursor.getColumnIndex(COLUMN_DATE_DEPART)).substring(0,4));
}
while (cursor.moveToNext());
}
cursor.close();
db.close();
return an;
}
public List<String> ListeMoisTrajet(String et_iduser, String et_annee) {
List<String> mo = new ArrayList<>();
String selectQuery = "SELECT DISTINCT * FROM " + TABLE_NAME3 + " WHERE (" + COLUMN_ID_CHAUFFEUR + " = '" + et_iduser + "' AND " + COLUMN_DATE_DEPART + " >= DATE('NOW') AND SUBSTR(" + COLUMN_DATE_DEPART + ",1,4) = '" + et_annee + "') GROUP BY SUBSTR(" + COLUMN_DATE_DEPART + ",6,7) ORDER BY " + COLUMN_DATE_DEPART + " ASC";
db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
if (cursor.moveToFirst()) {
do {
mo.add(cursor.getString(cursor.getColumnIndex(COLUMN_DATE_DEPART)).substring(5,7));
} while (cursor.moveToNext());
}
cursor.close();
db.close();
return mo;
}
答案 0 :(得分:1)
@Mike T你应该在巴黎的香榭丽舍大街上获得金色雕像,但是因为到目前为止我无法为你建造这个金像,所以请接受我永恒的感激之情。实际上我改变了我的查询,你说:
public List<String> ListeMoisTrajet(String et_iduser, String et_annee) {
List<String> mo = new ArrayList<>();
String selectQuery = "SELECT DISTINCT " + COLUMN_DATE_DEPART + " FROM " + TABLE_NAME3 + " WHERE (" + COLUMN_ID_CHAUFFEUR + " = '" + et_iduser + "' AND " + COLUMN_DATE_DEPART + " >= DATE('NOW') AND SUBSTR(" + COLUMN_DATE_DEPART + ",1,4) = '" + et_annee + "') GROUP BY SUBSTR(" + COLUMN_DATE_DEPART + ",6,2) ORDER BY " + COLUMN_DATE_DEPART + " ASC";
我简直不敢相信我花了好几个星期......: - )
答案 1 :(得分:0)
DISTINCT 适用于整个结果集,因此指定*表示根据DISTINCT仅删除所有值重复的整行。然而,GROUP BY具有类似的效果,因此实际上限制了结果(两个用途中的DISTINCT都没有,因为id总是唯一的,假设它是rowid的别名,不确定?then check here和/或{{ 3}})。
我认为你也在混淆SQLite的SUBSTR函数和Java substring
方法。后者使用索引,因此5,7将返回2个字符。虽然SQLite SUBSTR
函数使用offset和字符数,因此6,7将返回最多7个字符。
我相信你可以尝试类似的东西: -
String selectQuery = "SELECT DISTINCT SUBSTR(" + COLUMN_DATE_DEPART + "6,2) AS month FROM " + TABLE_NAME3 + " WHERE (" + COLUMN_ID_CHAUFFEUR + " = '" + et_iduser + "' AND " + COLUMN_DATE_DEPART + " >= DATE('NOW') AND SUBSTR(" + COLUMN_DATE_DEPART + ",1,4) = '" + et_annee + "') ORDER BY " + COLUMN_DATE_DEPART + " ASC";
请注意,上面将返回一个光标,其中只有一列名为月,所以
mo.add(cursor.getString(cursor.getColumnIndex(COLUMN_DATE_DEPART)).substring(5,7));
将更改为: -
mo.add(cursor.getString(cursor.getColumnIndex("month")));
或
mo.add(cursor.getString(0));
另外将GROUP BY SUBSTR(" + COLUMN_DATE_DEPART + ",6,7)
更改为GROUP BY SUBSTR(" + COLUMN_DATE_DEPART + ",6,2)
也可能有效(即为什么YEARS有效,但MONTHS没有)。
注意上面没有检查过,所以可能有奇怪的错误。目前尚不清楚实际的子系统是什么,但假设COLUMN_DATE_DEPART列的格式为YYYY / MM / DD。