Мутация GraphQL возвращает значение null при обновлении

Я использую библиотеку Amazon Amplify для GraphQL. Мутации создания возвращают в ответ ненулевые данные, но мутации обновления возвращают в ответе нулевые данные.

Amplify.API.query(ModelQuery.list(Login.class), response -> {
    boolean isThere = false;
    for (Login login : response.getData()) {
        if (login.getLoginEmail().equals(loginEmail)) {
            isThere = true;
            break;
        }
    }
    if (isThere) {
        Log.e("MyAmplifyApp", "Update Query");
        Amplify.API.mutate(ModelMutation.update(todo),
            response3 -> Log.i("MyAmplifyApp", "Updated Todo with id: " + response3.getData().getId()),
            error -> Log.e("MyAmplifyApp", "Update failed", error)
        );
    } else {
        Log.e("MyAmplifyApp", "Insert Query");
        Amplify.API.mutate(ModelMutation.create(todo),
            response2 -> Log.i("MyAmplifyApp", "Added Todo with id: " + response2.getData().getId()),
            error -> Log.e("MyAmplifyApp", "Create failed", error)
        );
    }
}, error -> Log.e("MyAmplifyApp", "Query failure", error));

Журнал ошибок:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.amplifyframework.datastore.generated.model.Login.getId()' on a null object reference
        at com.example.todo.Activity.LoginActivity.lambda$null$0(LoginActivity.java:722)
        at com.example.todo.Activity.-$$Lambda$LoginActivity$gU4azCKLr7DOG8SII3C8XdBDaxk.accept(lambda)
        at com.amplifyframework.api.aws.AppSyncGraphQLOperation$OkHttpCallback.onResponse(AppSyncGraphQLOperation.java:140)
        at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:519)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
        at java.lang.Thread.run(Thread.java:760)

2 ответа

В ModelMutation.update(todo), то todo вы проходите это null. Вы должны пройтиtodo модель с таким же idкоторый вы получили изответа на запрос:

if (isThere) {
    Log.e("MyAmplifyApp", "Update Query");
    Amplify.API.mutate(ModelMutation.update(todo),
        response3 -> Log.i("MyAmplifyApp", "Updated Todo with id: " + response3.getData().getId()),
        error -> Log.e("MyAmplifyApp", "Update failed", error)
    );
} else {
    Log.e("MyAmplifyApp", "Insert Query");
    Amplify.API.mutate(ModelMutation.create(todo),
        response2 -> Log.i("MyAmplifyApp", "Added Todo with id: " + response2.getData().getId()),
        error -> Log.e("MyAmplifyApp", "Create failed", error)
    );
}

Решение:

  • Шаг 1 -> создать данные в таблице
  • Шаг 2 -> получить данные (здесь вы получите id с данными)
  • Шаг 3 -> на стороне Android создайте новую модель с новыми данными
  • Шаг 4 -> обновите модель по perticular id, который вы получаете step no 2

Вы должны пройти idво вновь созданной модели. Оттуда он автоматически займетid вы получите, когда получите список из базы данных:

Todo todo1 = Todo.builder()
    .name("My updated todo")
    .id(todo.getId())
    .build();
Amplify.API.mutate(ModelMutation.update(todo1),
    updateSprint -> {
        // Log.e( "Updatesdfsdfsdf--->", updateSprint.getData().getId()+"");
    }, error -> {
        Log.e(TAG, "Error", error);
    }
);

Что было проблемой:

Я не предоставил соответствующий идентификатор для обновленного объекта. Таким образом, API получает нулевой идентификатор и отправляет нулевой ответ.

Решение:

Согласно документации, просто получитеid существующего пользователя и передайте параметры, которые вы хотите обновить, как показано ниже:

Login update = todo.copyOfBuilder()
    .loginName(NEW NAME)
    .id(id)
    .build();

Полный пример:

Amplify.API.query(ModelQuery.list(Login.class), response -> {
    String id = null;
    boolean isThere = false;
    for (Login login : response.getData()) {
        if (login.getLoginEmail().equals(loginEmail)) {
            id = login.getId();
            isThere = true;
            break;
        }
    }
    if (isThere) {
        Log.e("MyAmplifyApp", "Update Query");
        Login update = todo.copyOfBuilder()
            .loginName(NEW NAME)
            .id(id)
            .build();
        Amplify.API.mutate(ModelMutation.update(update),
            response3 -> Log.i("MyAmplifyApp", "Updated Todo with id: " + response3.getData().getId()),
            error -> Log.e("MyAmplifyApp", "Update failed", error)
        );
    } else {
        Log.e("MyAmplifyApp", "Insert Query");
        Amplify.API.mutate(ModelMutation.create(todo),
            response2 -> Log.i("MyAmplifyApp", "Added Todo with id: " + response2.getData().getId()),
            error -> Log.e("MyAmplifyApp", "Create failed", error)
        );
    }
}, error -> Log.e("MyAmplifyApp", "Query failure", error));
Другие вопросы по тегам