簡體   English   中英

為什么我的內部聯接查詢不返回任何內容?

[英]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)};

  • the_id_that_you_are_looking_for將是一個很長的長度(可以是int,但應該正確地是很長),它是從您調用查詢的位置(例如,在活動中)傳遞/獲得的。

問題編輯后。

假設其他情況下的其他查詢有效,則可以使用:

    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;

筆記

  • 與其他情況一樣,這基本上是使用查詢方法,因為看起來根本的問題是您不知道如何包括JOIN (基本上它是第一個參數的一部分)。
    • 第一個參數表,盡管文檔說是要根據其編譯查詢的表名。 SQLiteDatabase-查詢實際上是FROM子句,並且可能非常復雜(如上所述)。
  • 我沒有假設其他參數可以直接使用,因此很可能是投影,子句,selectionargs和sortorder可以直接使用( 因此, table可能是您唯一需要關注的變量 )。
  • 上面的代碼是內部代碼,尚未經過測試或運行,因此可能包含錯誤。

或者,您可以使用:-

    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;
  • 假設selectionArgs僅是傳遞的id。
  • 這將比以前的方法適應性差。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM