当 运行 在 android 上使用 where 子句进行 sqlite 查询时,我没有得到任何结果
I get no results when running an sqlite query on android with a where clause
我正在编写一个应用程序来跟踪用户在给定日期输入的两个数字。该项目对我来说是一种学习练习,也是我的 SO 在工作中使用的东西。使用 android studio 中的数据库检查器,我能够看到数据库具有以下值:
| Date (String) | morningodometer (REAL)| eveningodometer (REAL) |
| ------------- | --------------------- | ---------------------- |
| 2021-01-01 | 42.0 | 56.9 |
我有一个查询,然后从 table 获取数据,其中 date = 2021-01-01
,但我的查询返回 0 个条目。我的数据库 definition/helper 在这里:
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();
}
我在应用程序中放入调试语句和弹出窗口,显示用于选择参数的日期,它在视觉上与数据库条目匹配。因此,我删除了我的选择标准,并将返回的游标中的日期与格式化日期字符串进行了比较,结果表明它们相等。
关于我做错了什么,我有点难过。
您不能将 ?
占位符用于列名,只能用于参数值。
更改为:
String selection = DatabaseHelper.DATE + "=?";
String[] selectionArgs = {formattedDate};
我正在编写一个应用程序来跟踪用户在给定日期输入的两个数字。该项目对我来说是一种学习练习,也是我的 SO 在工作中使用的东西。使用 android studio 中的数据库检查器,我能够看到数据库具有以下值:
| Date (String) | morningodometer (REAL)| eveningodometer (REAL) |
| ------------- | --------------------- | ---------------------- |
| 2021-01-01 | 42.0 | 56.9 |
我有一个查询,然后从 table 获取数据,其中 date = 2021-01-01
,但我的查询返回 0 个条目。我的数据库 definition/helper 在这里:
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();
}
我在应用程序中放入调试语句和弹出窗口,显示用于选择参数的日期,它在视觉上与数据库条目匹配。因此,我删除了我的选择标准,并将返回的游标中的日期与格式化日期字符串进行了比较,结果表明它们相等。 关于我做错了什么,我有点难过。
您不能将 ?
占位符用于列名,只能用于参数值。
更改为:
String selection = DatabaseHelper.DATE + "=?";
String[] selectionArgs = {formattedDate};