У меня есть две таблицы тренировок и упражнений.Я пытаюсь получить все упражнения с идентификатором workout_id, который соответствует тренировке, на которую мы нажали.Я сделал запрос Inner Join, но он, похоже, ничего не возвращает.Что-то не так с моим запросом?
Я использую SQLite для создания своей базы данных.Я проверил, чтобы убедиться, что в таблице «Упражнения» есть упражнения, и у них есть workout_id.
Мой запрос:
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor cursor = null;
int match = uriMatcher.match(uri);
switch (match){
case WORKOUT:
cursor = db.query(WorkoutContract.WorkoutEntry.TABLE_NAME_WORKOUT,projection,selection,selectionArgs,null,null,sortOrder);
break;
case WORKOUT_ID:
selection = WorkoutContract.WorkoutEntry._ID + "=?";
selectionArgs = new String[]{String.valueOf(ContentUris.parseId(uri))};
cursor = db.query(WorkoutContract.WorkoutEntry.TABLE_NAME_WORKOUT,projection,selection,selectionArgs,null,null,sortOrder);
break;
case EXERCISE:
cursor = db.query(WorkoutContract.WorkoutEntry.TABLE_NAME_EXERCISES,projection,selection,selectionArgs,null,null,sortOrder);
break;
case EXERCISE_ID:
selection = WorkoutContract.WorkoutEntry._ID + "=?";
selectionArgs = new String[]{String.valueOf(ContentUris.parseId(uri))};
cursor = db.query(WorkoutContract.WorkoutEntry.TABLE_NAME_EXERCISES,projection,selection,selectionArgs,null,null,sortOrder);
break;
case WORkOUT_EXERCISE:
final String QUERY = "SELECT workouts._id, " +
"exercise_name," +
"weight," +
"reps," +
"rpe"+
" FROM "+
"exercises"+
" INNER JOIN workouts ON workouts._id = exercises.workout_id"+
" WHERE workouts._id=1";
cursor = db.rawQuery(QUERY, null);
break;
default:
throw new IllegalArgumentException("Failed to retrieve" + uri);
}
cursor.setNotificationUri(getContext().getContentResolver(),uri);
int rowcount = cursor.getCount();
Log.d("ROWCOUNT","Number of rows = " + String.valueOf(rowcount));
return cursor; }
Мои таблицы:
String CREATE_TABLE_WORKOUTS = "CREATE TABLE " + WorkoutContract.WorkoutEntry.TABLE_NAME_WORKOUT + " ("
+ WorkoutContract.WorkoutEntry._ID + " INTEGER PRIMARY KEY, "
+ WorkoutContract.WorkoutEntry.WORKOUT_TITLE + " STRING, "
+ WorkoutContract.WorkoutEntry.WORKOUT_DATE + " STRING" + ")";
String CREATE_TABLE_EXERCISES = "CREATE TABLE " + WorkoutContract.WorkoutEntry.TABLE_NAME_EXERCISES + " ("
+ WorkoutContract.WorkoutEntry._ID + " INTEGER PRIMARY KEY, "
+ WorkoutContract.WorkoutEntry.EXERCISE_NAME + " STRING, "
+ WorkoutContract.WorkoutEntry.REPS + " INTEGER, "
+ WorkoutContract.WorkoutEntry.RPE + " INTEGER, "
+ WorkoutContract.WorkoutEntry.WEIGHT + " INTEGER, "
+ WorkoutContract.WorkoutEntry.WORKOUT_ID + " INTEGER, "
+ "FOREIGN KEY"+"("+ WorkoutContract.WorkoutEntry.WORKOUT_ID+")" + " REFERENCES "
+ WorkoutContract.WorkoutEntry.TABLE_NAME_WORKOUT
+"("
+(WorkoutContract.WorkoutEntry._ID) +")" +")";
Я ожидаю, что курсор вернет некоторые упражнения с соответствующим workout_id, но я, похоже, ничего не получу обратно.Никаких ошибок не возникает, просто пустой список.
ИСПРАВЛЕНО
1) Я указывал на неверный URI в MainActivity, поэтому я его изменил.
Uri uri = withAppendedId(WorkoutContract.WorkoutEntry.CONTENT_URI, id);
Uri uri = withAppendedId(WorkoutContract.WorkoutEntry.JOIN_TABLE_URI, id);
2) Назад внутрьмой класс WorkoutProvider Я установил selectionArgs:
selectionArgs = new String[]{String.valueOf(ContentUris.parseId(uri))};
и передал это в мой rawQuery.
cursor = db.rawQuery(QUERY, selectionArgs);