Получение курсора из 2 таблиц с несколькими строками из второй таблицы - PullRequest
0 голосов
/ 10 июня 2018

У меня есть 2 стола: один стол игрока, другой стол матчей.Я хочу, чтобы курсор сделал список теннисных матчей в моем MatchCursorAdapter.Я справился с этим, сделав дубликаты данных названий столбцов и изображения игроков в обеих таблицах, которые мне нужно показать в моем списке.Теперь я хочу сделать это правильно, просто имея идентификатор игрока в матчах за столом и с идентификатором игрока, я могу получить его имя и изображение из таблицы игроков.Я пытаюсь использовать INNER JOINER, но мне нужно 2 или 4 игрока, поэтому у меня будут одинаковые имена столбцов. Я не уверен, как к этому приблизиться и как извлечь данные из курсора. Вот изображение моих таблиц и курсора, я хочу для большей ясности Это моя попытка, но только для 1 игрока, и мне нужно все 4:

  case MATCHES:
                SQLiteQueryBuilder mQueryBuilderMatches = new SQLiteQueryBuilder();
                mQueryBuilderMatches.setTables(
                        PlayerContract.MatchEntry.TABLE_NAME + " INNER JOIN " +
                                PlayerContract.PlayerEntry.TABLE_NAME + " ON " +
                                PlayerContract.MatchEntry.TABLE_NAME + "." +
                                PlayerContract.MatchEntry.COLUMN_PLAYER_1_ID + " = " +
                                PlayerContract.PlayerEntry.TABLE_NAME + "." +
                                PlayerContract.PlayerEntry._ID);

              cursor = mQueryBuilderMatches.query(database, projection, selection, selectionArgs, null, null, sortOrder);
              break;  

Это мой метод создания длятаблицы:

public void onCreate(SQLiteDatabase db) {
        String SQL_CREATE_ENTRIES =
                "CREATE TABLE " + PlayerEntry.TABLE_NAME + " (" +
                        PlayerEntry._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                        PlayerEntry.COLUMN_PLAYER_NAME + " TEXT NOT NULL, " +
                        PlayerEntry.COLUMN_PLAYER_NATIONALITY + " TEXT, " +
                        PlayerEntry.COLUMN_PLAYER_YEAR_BORN + " INTEGER NOT NULL DEFAULT 0, " +
                        PlayerEntry.COLUMN_PLAYER_GENDER + " INTEGER NOT NULL, " +
                        PlayerEntry.COLUMN_PLAYER_WEIGHT + " INTEGER NOT NULL DEFAULT 0, " +
                        PlayerEntry.COLUMN_PLAYER_HEIGHT + " INTEGER NOT NULL DEFAULT 0, " +
                        PlayerEntry.COLUMN_PLAYER_PICTURE + " BLOB);";
        String SQL_CREATE_ENTRIES_MATCH =
                "CREATE TABLE " + MatchEntry.TABLE_NAME + " (" +
                        MatchEntry._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                        MatchEntry.COLUMN_PLAYER_1_ID + " INTEGER, " +
                        MatchEntry.COLUMN_PLAYER_2_ID + " INTEGER, " +
                        MatchEntry.COLUMN_PLAYER_2_TEAM_1_ID + " INTEGER, " +
                        MatchEntry.COLUMN_PLAYER_2_TEAM_2_ID + " INTEGER, " +
                        MatchEntry.COLUMN_PLAYER_1_NAME + " TEXT, " +
                        MatchEntry.COLUMN_PLAYER_2_NAME + " TEXT, " +
                        MatchEntry.COLUMN_PLAYER_1_PICTURE + " BLOB, " +
                        MatchEntry.COLUMN_PLAYER_2_PICTURE + " BLOB, " +
                        MatchEntry.COLUMN_MATCH_ARRAY_LIST + " TEXT, " +
                        MatchEntry.COLUMN_MATCH_TIME + " TEXT, " +
                        MatchEntry.COLUMN_MATCH_DATE + " TEXT, " +
                        MatchEntry.COLUMN_MATCH_FINISH + " INTEGER);";

        db.execSQL(SQL_CREATE_ENTRIES);
        db.execSQL(SQL_CREATE_ENTRIES_MATCH);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        if (oldVersion < 2) {
            db.execSQL(DATABASE_ALTER_TEAM_1_PLAYER_2_ID);
            db.execSQL(DATABASE_ALTER_TEAM_2_PLAYER_2_ID);
        }
    }

1 Ответ

0 голосов
/ 10 июня 2018

Возможно, следующее может дать вам представление: -

Допустим, следующие сокращенные версии (столбцы опущены для краткости) ваших таблиц вместе с некоторыми данными (12 пьес) и 4 совпадениями, 2 одиночными и 2 двойными:-

DROP TABLE IF EXISTS players;
DROP TABLE IF EXISTS matches;
CREATE TABLE IF NOT EXISTS players (
    id INTEGER PRIMARY KEY, 
    name TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS matches (
    id INTEGER PRIMARY KEY, 
    match_date TEXT, 
    match_time TEXT, 
    match_type INTEGER DEFAULT 1, -- 1 = singles(default) 2 = doubles
    side1_player1 INTEGER NOT NULL, 
    side1_player2 INTEGER, 
    side2_player1 INTEGER NOT NULL, 
    side2_player2 INTEGER
);

INSERT INTO players (name) 
    VALUES
        ('Fred'), -- player 1
        ('Bert'), -- player 2
        ('Mary'), -- 3
        ('Ann'), -- 4
        ('Mark'), -- 5
        ('Jane'), -- 6
        ('Alan'), -- 7
        ('Susan'), -- 8
        ('Charles'), -- 9
        ('Cathryn'), -- 10
        ('George'), -- 11
        ('Elaine'); -- 12

-- Singles matches
INSERT INTO matches (match_date, match_time, match_type, side1_player1, side2_player1)
    VALUES
        ('2018-01-01','10:30',1,1,11), -- Fred v George
        ('2018-01-01','11:30',1,3,10) -- Mary v Cathryn
;

-- Doubles matches
INSERT INTO matches (match_date, match_time, match_type,side1_player1,side1_player2,side2_player1,side2_player2)
    VALUES
        ('2018-01-01','14:00',2,1,2,7,9), -- Fred & Bert v Alan & Charles
        ('2018-01-01','15:00',2,4,12,6,3) -- Ann & Elaine v Jane & Mary

Таким образом, таблица Игроков выглядит так: -

enter image description here

А таблица Матчей выглядит так: -

enter image description here

Тогда: -

SELECT 
    CASE 
        WHEN match_type = 2 THEN 'Doubles'
        WHEN match_type = 1 THEN 'Singles'
    END AS type_of_match,
    match_date, match_time,
    CASE
            WHEN match_type = 2 THEN 
                side1player1.name || ' and ' || side1player2.name || 
                ' V ' || 
                side2player1.name || ' and ' || side2player2.name
          WHEN match_type = 1 THEN 
                side1player1.name ||
                ' V ' || 
                side2player1.name   
    END AS players
FROM matches 
JOIN players AS side1player1 ON side1_player1 = side1player1.id
JOIN players AS side2player1 ON side2_player1 = side2player1.id
LEFT JOIN players AS side1player2 ON side1_player2 = side1player2.id
LEFT JOIN players AS side2player2 ON side2_player2 = side2player2.id
;

В результате: -

enter image description here

Без манипулирования производными столбцами запрос будет: -

SELECT *
FROM matches 
JOIN players AS side1player1 ON side1_player1 = side1player1.id
JOIN players AS side2player1 ON side2_player1 = side2player1.id
LEFT JOIN players AS side1player2 ON side1_player2 = side1player2.id
LEFT JOIN players AS side2player2 ON side2_player2 = side2player2.id
;

И это приведет к: -

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...