Мутация 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));