如何避免在微调器中从sqlite中获取double数据?

问题描述 投票:0回答:2

我正在尝试从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;
    }
java android sqlite
2个回答
0
投票

DISTINCT适用于整个结果集,因此指定*表示根据DISTINCT仅删除所有值的重复行。然而,GROUP BY具有类似的效果,因此事实上限制了结果(两个用途中的DISTINCT没有任何作用,因为id将始终是唯一的,假设它是rowid的别名,不确定?then check here和/或here)。

我认为你也在混淆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";

请注意,上面将返回一个只有1列名为month的游标

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。


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";

我简直不敢相信我花了几周时间...... :-)

© www.soinside.com 2019 - 2024. All rights reserved.