如何将传递到BowlerActivity的League ID存入SQLite关联Bowler
我明白你卡在哪了——已经成功拿到leagueId并显示在界面上,但就是没法把这个ID和新创建的Bowler绑定并存进数据库。咱们一步步来解决这个问题:
1. 先把leagueId变成BowlerActivity的全局成员变量
你之前在onCreate里把leagueId当成局部变量处理,导致其他方法(比如创建Bowler的逻辑)没法访问它。先调整类的成员变量定义:
public class BowlerActivity extends AppCompatActivity { // 新增这个全局变量,让整个类的方法都能拿到当前联赛ID private int currentLeagueId; // 你原来的其他成员变量... private BowlerAdapter mAdapter; private List<Bowler> bowlersList = new ArrayList<>(); // ...
然后在onCreate里给这个变量赋值:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_bowler); // 获取并保存联赛ID到全局变量 currentLeagueId = getIntent().getIntExtra("leagueId", 1); // 显示到TextView的逻辑保留 TextView myText = findViewById(R.id.tvLeagueId); myText.setText(String.valueOf(currentLeagueId)); // 你的其他初始化代码... }
2. 补全/修改showBowlerDialog方法,传递联赛ID
你的showBowlerDialog方法看起来没写完,假设它是弹出输入框让用户填写Bowler名字的对话框。在对话框的确认按钮点击时,要把输入的名字和currentLeagueId一起传给创建方法:
private void showBowlerDialog(boolean isUpdate, Bowler existingBowler, int position) { AlertDialog.Builder builder = new AlertDialog.Builder(this); LayoutInflater inflater = getLayoutInflater(); View dialogView = inflater.inflate(R.layout.dialog_add_bowler, null); builder.setView(dialogView); final EditText etBowlerName = dialogView.findViewById(R.id.et_bowler_name); // 编辑模式下填充已有名字 if (isUpdate && existingBowler != null) { etBowlerName.setText(existingBowler.getName()); } builder.setTitle(isUpdate ? "Edit Bowler" : "Add Bowler") .setPositiveButton(isUpdate ? "Update" : "Save", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String bowlerName = etBowlerName.getText().toString().trim(); if (!bowlerName.isEmpty()) { if (isUpdate) { updateBowler(bowlerName, position); } else { // 新增时传入全局的联赛ID createBowler(bowlerName, currentLeagueId); } } } }) .setNegativeButton("Cancel", (dialog, which) -> dialog.dismiss()); builder.create().show(); }
3. 修改createBowler方法,接收并使用联赛ID
原来的createBowler只接收名字,现在要加上联赛ID参数,调用数据库插入方法时一起传进去:
private void createBowler(String bowlerName, int leagueId) { // 调用更新后的插入方法,传入名字和联赛ID long id = db.insertBowler(bowlerName, leagueId); Bowler newBowler = db.getBowler(id); if (newBowler != null) { bowlersList.add(0, newBowler); mAdapter.notifyDataSetChanged(); toggleEmptyBowlers(); } }
4. 更新DatabaseHelper的insertBowler方法
确保你的bowler表有league_id字段,然后修改插入逻辑把联赛ID存入数据库:
public long insertBowler(String bowlerName, int leagueId) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(COLUMN_BOWLER_NAME, bowlerName); // 新增这行,把联赛ID存入对应字段 values.put(COLUMN_LEAGUE_ID, leagueId); long id = db.insert(TABLE_BOWLERS, null, values); db.close(); return id; }
额外优化:只显示当前联赛的Bowler
如果需要BowlerActivity只展示当前联赛的选手,记得修改getAllBowlers方法,加上联赛ID的筛选条件:
public List<Bowler> getAllBowlers(int leagueId) { List<Bowler> bowlers = new ArrayList<>(); String selectQuery = "SELECT * FROM " + TABLE_BOWLERS + " WHERE " + COLUMN_LEAGUE_ID + " = ? " + " ORDER BY " + COLUMN_BOWLER_NAME + " ASC"; SQLiteDatabase db = this.getWritableDatabase(); Cursor cursor = db.rawQuery(selectQuery, new String[]{String.valueOf(leagueId)}); if (cursor.moveToFirst()) { do { Bowler bowler = new Bowler(); bowler.setId(cursor.getInt(cursor.getColumnIndex(COLUMN_BOWLER_ID))); bowler.setName(cursor.getString(cursor.getColumnIndex(COLUMN_BOWLER_NAME))); bowler.setLeagueId(cursor.getInt(cursor.getColumnIndex(COLUMN_LEAGUE_ID))); bowlers.add(bowler); } while (cursor.moveToNext()); } cursor.close(); db.close(); return bowlers; }
然后在BowlerActivity的onCreate里调用这个方法:
bowlersList.addAll(db.getAllBowlers(currentLeagueId));
内容的提问来源于stack exchange,提问作者Robert Vogl
相关产品推荐
相关产品推荐

