Page updated Jan 16, 2024

Read application data

Query item

Now that you were able to make a mutation, take the Id that was printed out and use it in your query to retrieve data.

1private void getTodo(String id) {
2 Amplify.API.query(
3 ModelQuery.get(Todo.class, id),
4 response -> Log.i("MyAmplifyApp", ((Todo) response.getData()).getName()),
5 error -> Log.e("MyAmplifyApp", error.toString(), error)
6 );
7}
1private fun getTodo(id: String) {
2 Amplify.API.query(ModelQuery.get(Todo::class.java, id),
3 { Log.i("MyAmplifyApp", "Query results = ${(it.data as Todo).name}") },
4 { Log.e("MyAmplifyApp", "Query failed", it) }
5 );
6}
1suspend fun getTodo(id: String) {
2 try {
3 val response = Amplify.API.query(ModelQuery.get(Todo::class.java, id))
4 Log.i("MyAmplifyApp", response.data.name)
5 } catch (error: ApiException) {
6 Log.e("MyAmplifyApp", "Query failed", error)
7 }
8}
1private void getTodo(String id) {
2 RxAmplify.API.query(ModelQuery.get(Todo.class, id))
3 .subscribe(
4 response -> Log.i("MyAmplifyApp", ((Todo) response.getData()).getName()),
5 error -> Log.e("MyAmplifyApp", error.toString(), error)
6 );
7}

List items

You can get the list of items that match a condition that you specify in Amplify.API.query:

1Amplify.API.query(
2 ModelQuery.list(Todo.class, Todo.NAME.contains("first")),
3 response -> {
4 for (Todo todo : response.getData()) {
5 Log.i("MyAmplifyApp", todo.getName());
6 }
7 },
8 error -> Log.e("MyAmplifyApp", "Query failure", error)
9);
1Amplify.API.query(
2 ModelQuery.list(Todo::class.java, Todo.NAME.contains("first")),
3 { response ->
4 response.data.forEach { todo ->
5 Log.i("MyAmplifyApp", todo.name)
6 }
7 },
8 { Log.e("MyAmplifyApp", "Query failure", it) }
9)
1try {
2 Amplify.API
3 .query(ModelQuery.list(Todo::class.java, Todo.NAME.contains("first")))
4 .response.data
5 .items.forEach { todo -> Log.i("MyAmplifyApp", todo.name) }
6} catch (error: ApiException) {
7 Log.e("MyAmplifyApp", "Query failure", error)
8}
1RxAmplify.API.query(ModelQuery.list(Todo.class, Todo.NAME.contains("first"))
2 .subscribe(
3 response -> {
4 for (Todo todo : response.getData()) {
5 Log.i("MyAmplifyApp", todo.getName());
6 }
7 },
8 error -> Log.e("MyAmplifyApp", "Query failure", error)
9 );

Note: This approach will only return up to the first 1,000 items. To change this limit or make requests for additional results beyond this limit, use pagination as discussed below.

List subsequent pages of items

A list query only returns the first 1,000 items by default, so for large data sets, you'll need to paginate through the results. After receiving a page of results, you can obtain a GraphQLRequest for requesting the next page, if there are more results available. The page size is configurable as well, as in the example below.

1public void queryFirstPage() {
2 query(ModelQuery.list(Todo.class, ModelPagination.limit(1_000)));
3}
4
5private static void query(GraphQLRequest<PaginatedResult<Todo>> request) {
6 Amplify.API.query(
7 request,
8 response -> {
9 if (response.hasData()) {
10 for (Todo todo : response.getData()) {
11 Log.d("MyAmplifyApp", todo.getName());
12 }
13 if (response.getData().hasNextResult()) {
14 query(response.getData().getRequestForNextResult());
15 }
16 }
17 },
18 failure -> Log.e("MyAmplifyApp", "Query failed.", failure)
19 );
20}
1fun queryFirstPage() {
2 query(ModelQuery.list(Todo::class.java, ModelPagination.limit(1_000)))
3}
4
5fun query(request: GraphQLRequest<PaginatedResult<Todo>>) {
6 Amplify.API.query(request,
7 { response ->
8 if (response.hasData()) {
9 response.data.items.forEach { todo ->
10 Log.d("MyAmplifyApp", todo.name)
11 }
12 if (response.data.hasNextResult()) {
13 query(response.data.requestForNextResult)
14 }
15 }
16 },
17 { Log.e("MyAmplifyApp", "Query failed", it) }
18 )
19}
1suspend fun queryFirstPage() {
2 query(ModelQuery.list(Todo::class.java,
3 ModelPagination.firstPage().withLimit(1_000)))
4}
5
6suspend fun query(request: GraphQLRequest<PaginatedResult<Todo>>) {
7 try {
8 val response = Amplify.API.query(request)
9 response.data.items.forEach { todo ->
10 Log.d("MyAmplifyApp", todo.name)
11 }
12 if (response.data.hasNextResult()) {
13 query(response.data.requestForNextResult)
14 }
15 } catch (error: ApiException) {
16 Log.e("MyAmplifyApp", "Query failed.", error)
17 }
18}
1BehaviorSubject<GraphQLRequest<PaginatedResult<Todo>>> subject =
2 BehaviorSubject.createDefault(ModelQuery.list(Todo.class, ModelPagination.limit(1_000)));
3subject.concatMap(request -> RxAmplify.API.query(request).toObservable())
4 .doOnNext(response -> {
5 if (response.hasErrors()) {
6 subject.onError(new Exception(String.format("Query failed: %s", response.getErrors())));
7 } else if (!response.hasData()) {
8 subject.onError(new Exception("Empty response from AppSync."));
9 } else if(response.getData().hasNextResult()) {
10 subject.onNext(response.getData().getRequestForNextResult());
11 } else {
12 subject.onComplete();
13 }
14 })
15 .concatMapIterable(GraphQLResponse::getData)
16 .subscribe(
17 todo -> Log.d(TAG, "Todo: " + todo),
18 error -> Log.e(TAG, "Error: " + error)
19 );