微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在带有 where 子句的 android 上运行 sqlite 查询时,我没有得到任何结果

如何解决在带有 where 子句的 android 上运行 sqlite 查询时,我没有得到任何结果

我正在编写一个应用程序来跟踪用户在给定日期输入的两个数字。该项目对我来说是一种学习练习,也是我的 SO 可以用于他的工作的东西。使用 android studio 中的数据库检查器,我可以看到数据库有值:

| Date (String) | morningodometer (REAL)| eveningodometer (REAL) |
| ------------- | --------------------- | ---------------------- |
| 2021-01-01    | 42.0                  | 56.9                   |

我有一个查询,然后从表中获取数据,其中 date = 2021-01-01,但我的查询返回 0 个条目。我的数据库定义/助手在这里

public class DatabaseHelper extends sqliteOpenHelper {

    public static final String TABLE_NAME = "BEEPBEEP";

    public static final String _ID = "_id";
    public static final String DATE = "date";
    public static final String MORNING_odoMETER = "morningodometer";
    public static final String EVENING_odoMETER = "eveningodometer";

    static final String DB_NAME = "BEEPBEEP.DB";

    static final int DB_VERSION = 1;

    private static final String CREATE_TABLE = "create table " + TABLE_NAME + " (" + DATE +
            " TEXT PRIMARY KEY," + MORNING_odoMETER + " REAL NOT NULL," + EVENING_odoMETER +
            " REAL NOT NULL);";

    public DatabaseHelper(Context context) {
        super(context,DB_NAME,null,DB_VERSION);
    }

    @Override
    public void onCreate(sqliteDatabase db) {
        db.execsql(CREATE_TABLE);
    }

    @Override
    public void onUpgrade(sqliteDatabase db,int oldVersion,int newVersion) {
        db.execsql("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
    }
}

我根据日期获取数字的代码在这里

    public Optional<Dayodometer> getodometerForDate(Date date) {
        String[] columns = new String[] {DatabaseHelper.MORNING_odoMETER,DatabaseHelper.EVENING_odoMETER};
        String formattedDate = dateFormatter.format(date);
        String selection = "?=?";
        String[] selectionArgs = {DatabaseHelper.DATE,formattedDate};
        Cursor cursor = dbHelper.getReadableDatabase().query(DatabaseHelper.TABLE_NAME,columns,selection,selectionArgs,null);
        if (cursor.getCount() > 0) {
            cursor.movetoFirst();
            float eveningKms = cursor.getFloat(cursor.getColumnIndex(DatabaseHelper.EVENING_odoMETER));
            float morningKms = cursor.getFloat(cursor.getColumnIndex(DatabaseHelper.MORNING_odoMETER));
            cursor.close();
            return Optional.of(new Dayodometer(morningKms,eveningKms));
        }
        return Optional.empty();
    }

我在应用程序中放入了调试语句和弹出窗口,显示了用于选择参数的日期,它在视觉上与数据库条目相匹配。然后我删除了我的选择标准,并将返回的游标中的日期与 formattedDate 字符串进行了比较,它说它们是相等的。 对于我做错了什么,我有点困惑。

解决方法

不能将 ? 占位符用于列名,只能用于参数值。
改成这样:

String selection = DatabaseHelper.DATE + "=?";
String[] selectionArgs = {formattedDate};

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。