[英]Why is my Inner Join query not returning anything?
我有兩個表格“鍛煉”和“練習”。 我正嘗試使用與我們單擊的“鍛煉”匹配的“ execution_id”來獲取所有鍛煉。 我進行了內部聯接查詢,但似乎未返回任何內容。 我的查詢有問題嗎?
我正在使用SQLite創建數據庫。 我已經檢查以確保“練習”表中有一些練習,並且它們都有一個execution_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) +")" +")";
我希望光標返回帶有相應的execution_id的一些練習,但是我似乎什么也沒回來。 沒有錯誤,只是一個空列表。
固定
1)我在MainActivity中指向錯誤的URI,所以我更改了它。
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);
您的問題是您實際上是在說..... WHERE workouts._id = '_id'
selectionArgs = new String[]{String.valueOf(WorkoutContract.WorkoutEntry.WORKOUT_ID)};
..... WHERE workouts._id = '_id'
因為您有selectionArgs = new String[]{String.valueOf(WorkoutContract.WorkoutEntry.WORKOUT_ID)};
並且該WorkoutContract.WorkoutEntry.WORKOUT_ID是列名_id 。
因此,永遠不會進行WHERE子句的匹配,因為_id列必須是整數(在Java語言中為長整數,因為它是64位帶符號整數),因為該列是rowid的別名。
相反,您需要有類似
selectionArgs = new String[]{String.valueOf(the_id_that_you_are_looking_for)};
假設其他情況下的其他查詢有效,則可以使用:
case WORkOUT_EXERCISE:
String table = WorkoutContract.WorkoutEntry.TABLE_NAME_EXERCISES +
" INNER JOIN " + WorkoutContract.WorkoutEntry.TABLE_NAME_WORKOUT +
" ON " + WorkoutContract.WorkoutEntry.TABLE_NAME_WORKOUT + "." +
WorkoutContract.WorkoutEntry._ID + " = " +
WorkoutContract.WorkoutEntry.TABLE_NAME_EXERCISES + "." +
WorkoutContract.WorkoutEntry.WORKOUT_ID;
String[] columns = new String[]{
WorkoutContract.WorkoutEntry.EXERCISE_NAME,
WorkoutContract.WorkoutEntry.WEIGHT,
WorkoutContract.WorkoutEntry.REPS,
WorkoutContract.WorkoutEntry.RPE
};
String whereclause = WorkoutContract.WorkoutEntry._ID + " =?";
cursor = db.query(table,columns,whereclause,selectionArgs,null,null,null);
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=?";
cursor = db.rawQuery(QUERY, selectionArgs);
break;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.