首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在带有where子句的android上运行sqlite查询时,没有结果

在带有where子句的android上运行sqlite查询时,没有结果
EN

Stack Overflow用户
提问于 2021-01-01 23:20:37
回答 1查看 52关注 0票数 1

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

代码语言:javascript
复制
| Date (String) | morningodometer (REAL)| eveningodometer (REAL) |
| ------------- | --------------------- | ---------------------- |
| 2021-01-01    | 42.0                  | 56.9                   |

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

代码语言:javascript
复制
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);
    }
}

根据日期,我得到数字的代码如下:

代码语言:javascript
复制
    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();
    }

我在应用程序中放置了调试语句和弹出窗口,显示用于选择args的日期,它与数据库条目直观地匹配。因此,我删除了我的选择标准,并将返回的游标中的日期与formattedDate字符串进行了比较,结果表明它们是相等的。我有点困惑于我做错了什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-01 23:24:57

不能将?占位符用于列的名称,而只能用于参数值。

改为:

代码语言:javascript
复制
String selection = DatabaseHelper.DATE + "=?";
String[] selectionArgs = {formattedDate};
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65534588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档