You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中不使用自增实现squad_id递增的问题

问题描述

我是Android Studio新手,正在开发一款运动统计APP,使用SQLite数据库存储球员、球队(squad)和数据。squad表中每支球队可添加15名球员,添加完成后希望将squad_id递增1。该表结构如下:

squad_table_id INTEGER PRIMARY KEY AUTOINCREMENT
squad_id INTEGER
squad_name TEXT
player_name TEXT
player_no INTEGER

squad_id并非主键,且不能使用自增。我已通过DISTINCT查询展示球队,点击可查看队内所有球员。现有按钮可输入15个球员姓名,对应的数据库添加方法如下:

public class AddNewSquad extends AppCompatActivity {

    private EditText player1, player2, player3, player4, player5, player6, player7, player8, player9,
    player10, player11, player12,player13, player14, player15;
    private Button addPlayerButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_squad_setup);

        player1 = findViewById(R.id.player1input);
        player2 = findViewById(R.id.player2input);
        player3 = findViewById(R.id.player3input);
        player4 = findViewById(R.id.player4input);
        player5 = findViewById(R.id.player5input);
        player6 = findViewById(R.id.player6input);
        player7 = findViewById(R.id.player7input);
        player8 = findViewById(R.id.player8input);
        player9 = findViewById(R.id.player9input);
        player10 = findViewById(R.id.player10input);
        player11 = findViewById(R.id.player11input);
        player12 = findViewById(R.id.player12input);
        player13 = findViewById(R.id.player13input);
        player14 = findViewById(R.id.player14input);
        player15 = findViewById(R.id.player15input);


        addPlayers();
    }

    public void addPlayers(){
        addPlayerButton = findViewById(R.id.addPlayersButton);
        addPlayerButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                int squad_increment = 0;
                MyDatabaseHelper myDB = new MyDatabaseHelper(AddNewSquad.this);
              
                myDB.addtoSquad(String.valueOf(squad_increment), "My First Squad", player1.getText().toString().trim(), String.valueOf(1));
                myDB.addtoSquad(String.valueOf(squad_increment), "My First Squad", player2.getText().toString().trim(), String.valueOf(2));
                myDB.addtoSquad(String.valueOf(squad_increment), "My First Squad", player3.getText().toString().trim(), String.valueOf(3));
                myDB.addtoSquad(String.valueOf(squad_increment), "My First Squad", player4.getText().toString().trim(), String.valueOf(4));
                myDB.addtoSquad(String.valueOf(squad_increment), "My First Squad", player5.getText().toString().trim(), String.valueOf(5));
                myDB.addtoSquad(String.valueOf(squad_increment), "My First Squad", player6.getText().toString().trim(), String.valueOf(6));
                myDB.addtoSquad(String.valueOf(squad_increment), "My First Squad", player7.getText().toString().trim(), String.valueOf(7));
                myDB.addtoSquad(String.valueOf(squad_increment), "My First Squad", player8.getText().toString().trim(), String.valueOf(8));
                myDB.addtoSquad(String.valueOf(squad_increment), "My First Squad", player9.getText().toString().trim(), String.valueOf(9));
                myDB.addtoSquad(String.valueOf(squad_increment), "My First Squad", player10.getText().toString().trim(), String.valueOf(10));
                myDB.addtoSquad(String.valueOf(squad_increment), "My First Squad", player11.getText().toString().trim(), String.valueOf(11));
                myDB.addtoSquad(String.valueOf(squad_increment), "My First Squad", player12.getText().toString().trim(), String.valueOf(12));
                myDB.addtoSquad(String.valueOf(squad_increment), "My First Squad", player13.getText().toString().trim(), String.valueOf(13));
                myDB.addtoSquad(String.valueOf(squad_increment), "My First Squad", player14.getText().toString().trim(), String.valueOf(14));
                myDB.addtoSquad(String.valueOf(squad_increment), "My First Squad", player15.getText().toString().trim(), String.valueOf(15));
                Intent intent = new Intent(AddNewSquad.this, SavedSquads.class);
                startActivity(intent);

            }
        });
    }
}

当前问题是每次打开该Activity时,squad_increment变量都会重置为0,导致所有球员的squad_id都相同。我尝试过调整变量位置,但问题依旧,数据库更新功能正常,问题出在squad_id的递增逻辑上,请问如何确保每添加15名球员后squad_id自动递增?

解决方案

核心思路是从数据库中读取当前最大的squad_id,以此为基础生成新的球队ID,而不是依赖内存变量(Activity销毁重建后内存变量会丢失)。

步骤1:在数据库工具类中添加获取最大squad_id的方法

在MyDatabaseHelper类中新增方法,用于查询当前已存在的最大squad_id:

public int getMaxSquadId() {
    SQLiteDatabase db = this.getReadableDatabase();
    // 使用IFNULL处理空表情况,空表时返回0
    Cursor cursor = db.rawQuery("SELECT IFNULL(MAX(squad_id), 0) FROM squad_table", null);
    int maxId = 0;
    if (cursor.moveToFirst()) {
        maxId = cursor.getInt(0);
    }
    cursor.close();
    db.close();
    return maxId;
}

步骤2:修改添加球队的逻辑

在AddNewSquad的点击事件中,替换原来的固定squad_increment,改为从数据库获取最大ID后加1:

@Override
public void onClick(View view) {
    MyDatabaseHelper myDB = new MyDatabaseHelper(AddNewSquad.this);
    // 获取新的球队ID:当前最大ID + 1
    int newSquadId = myDB.getMaxSquadId() + 1;

    // 批量添加15名球员,统一使用新的squadId
    myDB.addtoSquad(String.valueOf(newSquadId), "My First Squad", player1.getText().toString().trim(), String.valueOf(1));
    myDB.addtoSquad(String.valueOf(newSquadId), "My First Squad", player2.getText().toString().trim(), String.valueOf(2));
    myDB.addtoSquad(String.valueOf(newSquadId), "My First Squad", player3.getText().toString().trim(), String.valueOf(3));
    myDB.addtoSquad(String.valueOf(newSquadId), "My First Squad", player4.getText().toString().trim(), String.valueOf(4));
    myDB.addtoSquad(String.valueOf(newSquadId), "My First Squad", player5.getText().toString().trim(), String.valueOf(5));
    myDB.addtoSquad(String.valueOf(newSquadId), "My First Squad", player6.getText().toString().trim(), String.valueOf(6));
    myDB.addtoSquad(String.valueOf(newSquadId), "My First Squad", player7.getText().toString().trim(), String.valueOf(7));
    myDB.addtoSquad(String.valueOf(newSquadId), "My First Squad", player8.getText().toString().trim(), String.valueOf(8));
    myDB.addtoSquad(String.valueOf(newSquadId), "My First Squad", player9.getText().toString().trim(), String.valueOf(9));
    myDB.addtoSquad(String.valueOf(newSquadId), "My First Squad", player10.getText().toString().trim(), String.valueOf(10));
    myDB.addtoSquad(String.valueOf(newSquadId), "My First Squad", player11.getText().toString().trim(), String.valueOf(11));
    myDB.addtoSquad(String.valueOf(newSquadId), "My First Squad", player12.getText().toString().trim(), String.valueOf(12));
    myDB.addtoSquad(String.valueOf(newSquadId), "My First Squad", player13.getText().toString().trim(), String.valueOf(13));
    myDB.addtoSquad(String.valueOf(newSquadId), "My First Squad", player14.getText().toString().trim(), String.valueOf(14));
    myDB.addtoSquad(String.valueOf(newSquadId), "My First Squad", player15.getText().toString().trim(), String.valueOf(15));

    Intent intent = new Intent(AddNewSquad.this, SavedSquads.class);
    startActivity(intent);
}

优化建议

  • 简化重复代码:把15个EditText放入数组,用循环批量添加球员,避免冗余:
// 初始化EditText数组
EditText[] playerInputs = {player1, player2, player3, player4, player5,
                           player6, player7, player8, player9, player10,
                           player11, player12, player13, player14, player15};

// 循环添加球员
for (int i = 0; i < playerInputs.length; i++) {
    String playerName = playerInputs[i].getText().toString().trim();
    // 可添加空值判断,跳过未填写的球员
    if (!playerName.isEmpty()) {
        myDB.addtoSquad(String.valueOf(newSquadId), "My First Squad", playerName, String.valueOf(i + 1));
    }
}
  • 处理空输入:添加判断逻辑,跳过未填写的球员,避免插入空数据到数据库。

内容的提问来源于stack exchange,提问作者ct338

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 13:06:23