Android Studio添加Customer时如何更新Ticket的Is_Available字段?
问题分析与解决方案
你遇到的问题核心是获取选中Ticket的ID方式错误,以及后续更新时使用了无效的Ticket ID,导致更新操作找不到对应的记录,所以Toast一直显示"no"。咱们一步步拆解问题并修复:
1. 找出代码中的关键错误
错误点1:Spinner获取选中Ticket的ID不正确
你用了tickett.getSelectedItemId(),但这个方法返回的是Spinner列表中选中项的位置索引(从0开始),而不是Ticket表中的真实Ticket_id。这就导致你插入Customer时传入的Ticket_是错误的,后续更新时自然找不到对应的Ticket记录。
错误点2:更新Ticket时使用了空对象的ID
你创建了一个空的ticket对象t = new ticket(),调用t.getId()得到的是默认值(大概率是0),用这个无效ID去更新,数据库里根本没有ID为0的Ticket,所以更新必然失败。
2. 修复步骤与代码修改
第一步:修正Spinner获取选中Ticket的逻辑
直接获取Spinner选中的ticket对象实例,从中拿到真实的Ticket_id:
// 替换原来的int Ticket_=(int) tickett.getSelectedItemId(); ticket selectedTicket = (ticket) tickett.getSelectedItem(); int ticketId = selectedTicket.getId();
第二步:修正更新Ticket的调用
用拿到的真实ticketId去调用更新方法,不需要创建空对象:
// 替换原来的ticket t = new ticket(); ... if (db.update_isBookedIF0(ticketId, 1)) { Toast.makeText(Add_customer.this, "Customer added and ticket marked as booked!", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(Add_customer.this, "Failed to mark ticket as booked", Toast.LENGTH_SHORT).show(); }
第三步:(可选但推荐)添加数据库事务
插入Customer和更新Ticket是两个关联操作,应该放在事务中保证原子性(要么都成功,要么都失败),避免出现Customer已添加但Ticket未更新的情况:
在DatabaseHelper中新增一个方法:
public boolean addCustomerAndUpdateTicket(String name, String mobile, String passport, int ticketId) { SQLiteDatabase db = getWritableDatabase(); boolean success = false; db.beginTransaction(); try { // 插入Customer ContentValues customerValues = new ContentValues(); customerValues.put(customer.Col_Name, name); customerValues.put(customer.Col_Passport, passport); customerValues.put(customer.Col_Mobile, mobile); customerValues.put(customer.Col_Ticket_id, ticketId); db.insert(customer.Table_Name, null, customerValues); // 更新Ticket的Is_Available为1 ContentValues ticketValues = new ContentValues(); ticketValues.put(ticket.Col_isBooked, 1); db.update(ticket.Table_Name, ticketValues, ticket.Col_Id + " = ?", new String[]{String.valueOf(ticketId)}); db.setTransactionSuccessful(); success = true; } catch (Exception e) { e.printStackTrace(); } finally { db.endTransaction(); } return success; }
然后在Add_customer的点击事件中调用这个方法:
add.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String Name = name.getText().toString().trim(); String Mobile = mobile.getText().toString().trim(); String Passport = passport.getText().toString().trim(); // 先判断输入是否为空 if (Name.isEmpty() || Mobile.isEmpty() || Passport.isEmpty()) { Toast.makeText(Add_customer.this, "Please fill all fields", Toast.LENGTH_SHORT).show(); return; } ticket selectedTicket = (ticket) tickett.getSelectedItem(); if (selectedTicket == null) { Toast.makeText(Add_customer.this, "Please select a ticket", Toast.LENGTH_SHORT).show(); return; } int ticketId = selectedTicket.getId(); if (db.addCustomerAndUpdateTicket(Name, Mobile, Passport, ticketId)) { name.setText(""); mobile.setText(""); passport.setText(""); Toast.makeText(Add_customer.this, "Customer added successfully!", Toast.LENGTH_SHORT).show(); // 更新Spinner的数据源,移除已预订的票 data.remove(selectedTicket); adapter.notifyDataSetChanged(); } else { Toast.makeText(Add_customer.this, "Failed to add customer", Toast.LENGTH_SHORT).show(); } } });
3. 额外优化建议
- 给输入框添加非空校验,避免插入空数据
- 更新Spinner的数据源,移除已被预订的Ticket,避免重复选择
- 你的
update_isBookedIF0方法其实可以简化,因为你固定要设置为1,不需要传isBooked参数,直接写死即可
内容的提问来源于stack exchange,提问作者zahraa
相关产品推荐
相关产品推荐

