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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:19:50