如何在Retrofit 2(Android)中更新特定的孩子

时间:2018-02-22 04:27:02

标签: android retrofit2

如果有多个数据,我怎样才能更新Retrofit2中的特定子项。

正如您在附件中看到的那样,我有两个数据/乘客资料。我想将第一个旅客资料的余额更新为 tagID:613421 。怎么可能?

enter image description here

public interface APIServicePassenger {

@GET("/passengers")
Call<List<Passenger>> getPassengers();

@PUT("/passengers")
Call<List<Passenger>> updatePassengerProfile(@Field("balance") int balance);
}

但我不知道如何使用 PUT请求

public class Config {

public static final String BASE_URL = "http://busartery.....";

public static Retrofit getClient() {
    Retrofit retrofit = null;

    if (retrofit == null) {
        retrofit = new Retrofit.Builder()
                .baseUrl(Config.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }
    return retrofit;
}
}

我不知道我做的是否正确。

if (!medtCustomerID.getText().toString().trim().isEmpty() &&
                    !medtCustomerName.getText().toString().trim().isEmpty()) {
                balance += amountLoad;

                final Call<List<Passenger>> passengerCallList = servicePassenger.getPassengers();
                passengerCallList.enqueue(new Callback<List<Passenger>>() {
                    @Override
                    public void onResponse(Call<List<Passenger>> call, Response<List<Passenger>> response) {
                        if (response.isSuccessful()) {
                            List<Passenger> passengerList = response.body();

                            if (passengerList.size() != 0) {
                                for (int i = 0; i <passengerList.size(); i++) {
                                    String name = passengerList.get(i).getName();
                                    if (name.equals(medtCustomerName.getText().toString().trim())) {
                                        //to update that specific data
                                        Passenger passenger = new Passenger(balance);

                                        Call<List<Passenger>> callPassList = servicePassenger.updatePassengerProfile(
                                                passenger.getBalance());
                                        callPassList.enqueue(new Callback<List<Passenger>>() {
                                            @Override
                                            public void onResponse(Call<List<Passenger>> call, Response<List<Passenger>> response) {
                                                if (response.isSuccessful()) {
                                                    Toast.makeText(LoaderActivity.this, "Successfully loaded.\n New Load " +balance, Toast.LENGTH_SHORT).show();
                                                }
                                            }

                                            @Override
                                            public void onFailure(Call<List<Passenger>> call, Throwable t) {
                                                Toast.makeText(LoaderActivity.this, "onFailure(update): " +t.getMessage(), Toast.LENGTH_LONG).show();
                                            }
                                        });
                                    }
                                }
                            }
                        }
                    }

                    @Override
                    public void onFailure(Call<List<Passenger>> call, Throwable t) {
                        Toast.makeText(LoaderActivity.this, "onFailure(btnLoad) :"+t.getMessage(), Toast.LENGTH_LONG).show();
                    }
                });
            }

1 个答案:

答案 0 :(得分:0)

它关于您的客户端代码,但是您的服务器代码。 REST允许您使用@PUT更新内容 您发布的代码不能仅更新服务器上的部分节点。 和界面:

@PUT("/passengers")
Call<List<Passenger>> updatePassengerProfile(@Field("balance") int balance);

不会更新它,因为它不会知道你要更新的列表中的哪一部分,你应该提供一个乘客ID

@PUT("/passengers")
Call<List<Passenger>> updatePassengerProfile(@Field("balance") int 
balance,@Field("id") String id);

ps你可能会松开@Field注释。

此服务仅在服务器支持时才会起作用