【问题标题】:Getting cursor from 2 tables with multiple rows from second table从第二个表中获取具有多行的 2 个表中的光标
【发布时间】:2018-06-12 12:52:50
【问题描述】:

我有 2 张桌子,一张是 Player 桌子,另一张是 Matches 桌子。我想让光标在我的 MatchCursorAdapter 中列出网球比赛。我通过在我需要在列表中显示的两个表中制作重复的列名称和玩家图片数据来管理这一点。现在我想以正确的方式做到这一点,只需在表格比赛中获得玩家的 id,并且通过玩家的 id,我可以获得他的名字和图片形式的玩家表。我尝试使用 INNER JOINER,但我需要 2 或 4 个玩家,所以我将有相同的列名我不知道如何处理这个以及如何从游标中检索数据。 Here is an image of my tables and cursor I want for more clarity 这是我的尝试,但仅适用于 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);
        }
    }

【问题讨论】:

    标签: java android sqlite


    【解决方案1】:

    也许以下内容可以给你一个想法:-

    假设您的表格有以下精简版本(为简洁起见省略列)以及一些数据(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
    

    所以玩家表看起来像:-

    匹配表看起来像:-

    然后:-

    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
    ;
    

    会导致:-

    如果不操作派生列,查询将是:-

    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
    ;
    

    这会产生:-

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-21
      • 2020-01-04
      • 2018-07-13
      • 2018-05-17
      • 2019-12-21
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      相关资源
      最近更新 更多