我正在尝试使用 AWS 的 Android AppSync SDK 和 Amplify CLI 通过 AWS AppSync 查询 DynamoDB 表。我正在查询全球二级索引 (GSI)。我收到一个错误:
表达式块 '$[query]' 需要一个表达式
我发现了一个类似的问题,它建议了下面的修复。但是,它对我不起作用:
我schema.graphql
的是:
type olatexOrders @model
@key(fields: ["PK", "SK"])
@key(name: "GSI-item-1", fields: ["GSIPKitem1", "GSISKitem1" ], queryField: "olatexOrdersByGSIPKitem1AndGSISKitem1")
@key(name: "GSI-order-1", fields: ["GSIPKorder1", "GSISKorder1" ], queryField: "olatexOrdersByGSIPKorder1AndGSISKorder1")
{
PK: String!
SK: String!
GSIPKitem1: String
GSISKitem1: String
GSIPKorder1: String
GSISKorder1: String
... and many more fields not relevant for this case
}
在 DynamoDB 中正确创建了哈希键(主键 + 辅助键)和两个 GSI(GSI-item-1、GSI-order1)。我还可以使用 GSI 从 AppSync 查询我的 DynamoDB 表:
query MyQuery {
olatexOrdersByGSIPKorder1AndGSISKorder1(GSIPKorder1: "IN_PROGRESS") {
nextToken
items {
GSIPKorder1
GSISKorder1
}
}
}
但是,当我尝试在我的 Android 应用程序中使用自动生成的放大类时,它不起作用,如下所示:
private void query() {
AwsClientFactory.getInstance(context)
.query(OlatexOrdersByGsipKorder1AndGsisKorder1Query
.builder()
.gSIPKorder1(ORDER_STATUS_IN_PROGRESS)
.limit(200)
.build())
.responseFetcher(AppSyncResponseFetchers.NETWORK_ONLY)
.enqueue(callback);
}
我遇到了上面提到的同样的错误。阅读相关问题后,我的理解是在 AppSync 中实现 GSI 的方式存在一些错误/不一致/限制,因此您不仅需要指定 GSI 的主键,还需要指定排序键和排序顺序为出色地。有了这些知识,为了测试,我将我的函数重写为:
private void query() {
AwsClientFactory.getInstance(context)
.query(OlatexOrdersByGsipKorder1AndGsisKorder1Query
.builder()
.gSIPKorder1(ORDER_STATUS_IN_PROGRESS)
.gSISKorder1(ModelStringKeyConditionInput.builder().beginsWith("K").build())
.sortDirection(ModelSortDirection.DESC)
.limit(200)
.build())
.responseFetcher(AppSyncResponseFetchers.NETWORK_ONLY)
.enqueue(callback);
}
不幸的是,我仍然遇到同样的错误:
表达式块 '$[query]' 需要一个表达式
我正在使用 Amplify CLI 版本 4.27.2。所有帮助将不胜感激!
编辑 1
我试图简化我的案例。我创建了只有一列的 GSI。请看schema.graphql
下面:
type olatexOrders @model
@key(fields: ["PK", "SK"])
@key(name: "GSI-item-1", fields: ["GSIPKitem1"], queryField: "olatexOrdersByGSIItem")
@key(name: "GSI-order-1", fields: ["GSIPKorder1"], queryField: "olatexOrdersByGSIOrder")
{
PK: String!
SK: String!
GSIPKitem1: String
GSIPKorder1: String
... and many more fields not relevant for this case
}
现在我正在尝试下面的代码通过 Amplify & AppSync 查询我的发电机表:
public class GetInProgressOrders {
private GraphQLCall.Callback<OlatexOrdersByGsiOrderQuery.Data> callback = new GraphQLCall.Callback<OlatexOrdersByGsiOrderQuery.Data>() {
@Override
public void onResponse(@Nonnull Response<OlatexOrdersByGsiOrderQuery.Data> response) {
try{
Log.d("MyTest", "TST response error: "+errors.get(0).message());
}
catch (Exception e){
Log.e("MyTest", e.getMessage())
}
}
@Override
public void onFailure(@Nonnull ApolloException e) {
Log.e("MyTest", e.getMessage())
}
};
private void query(Context context){
AWSAppSyncClient awsClient = AwsClientFactory.getInstance(context);
OlatexOrdersByGsiOrderQuery tmpQuery = OlatexOrdersByGsiOrderQuery
.builder()
.gSIPKorder1(ORDER_STATUS_IN_PROGRESS)
.build();
awsClient.query(
tmpQuery
)
.responseFetcher(AppSyncResponseFetchers.NETWORK_ONLY)
.enqueue(callback);
}
}
上面的执行最终会出现与以前相同的错误:
TST response error: Expression block '$[query]' requires an expression
这让我觉得我做错了什么。基本上我无法通过 GSI 在 Amplify 中查询表。不幸的是,我没有看到我的错误。
问候