【问题标题】:I get no results when running an sqlite query on android with a where clause在带有 where 子句的 android 上运行 sqlite 查询时我没有得到任何结果
【发布时间】:2021-04-08 14:06:47
【问题描述】:

我正在编写一个应用程序来跟踪用户在给定日期输入的两个数字。该项目对我来说是一种学习练习,也是我的 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,
                null,
                null,
                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 字符串进行比较,它说它们是相等的。 我对自己做错了什么感到困惑。

【问题讨论】:

    标签: java android database sqlite android-sqlite


    【解决方案1】:

    您不能将? 占位符用于列名,只能用于参数值。
    改为:

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

    【讨论】:

      猜你喜欢
      • 2012-01-23
      • 2021-04-07
      • 2015-11-22
      • 2014-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多