Closed33

nested model を操作する[aws-mobile-appsync-sdk-android]

mutation CreatePost(
  $input: CreatePostInput!
) {
  createPost(input: $input) {
    Id
    CreatedAt
    Comment {
      Id
      Message
    }
  }
}

こういうような model があった場合に、自動生成されるコードから Comment 部分、つまり nested な部分の情報が落ちる

外部の型を参照しているとも言うかもしれない

maxDepth を 10 くらいにしてみようか
(今は 3)

amplify statements

Missing credentials in config, if using AWS_CONFIG_FILE, set AWS_SDK_LOAD_CONFIG=1

って怒られた
key 入れ直すのはどこからやるんだろうか
aws configure は微妙に挙動が違った

export AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXX
export AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
export AWS_DEFAULT_REGION=XXXXXXXXXXXX

環境変数で読み込ませると通った

amplify codegen configure

これで

? Enter maximum statement depth [increase from default if your schema is deeply nested] 10

10 にした

amplify codegen
# これは一応
amplify codegen types

これで、情報量は増えた。
ただ、抜けてたと思ってたところに変化はなかった

query は増えたけど
mutate は増えなかった

build したら生成後のところに増えてた…?

呼び出して予測で出るか見てみる

builder のところにはでてこない

nested なところは 別で クエリ発行しないといけない…?

aws console で見てみても、nested な部分は input に含まれてなかった

CreatePostInput には Comment の記述がない
CreatePostMutation には Comment の記述がない
CreatePostMutation.CreatePost には Comment の記述がある

作成したい時はどうすればええんや

https://github.com/awslabs/aws-mobile-appsync-sdk-android/blob/d27f4c0db2b57fb7f28f2c329e492920fa1c4c84/aws-android-sdk-appsync-tests/src/androidTest/java/com/amazonaws/mobileconnectors/appsync/models/Posts.java#L59-L75
        client.mutate(
            AddPostMutation.builder()
                .input(CreatePostInput.builder()
                    .title(title)
                    .author(author)
                    .url(url)
                    .content(content)
                    .ups(1)
                    .downs(0)
                    .build()
                )
                .build(),
            new AddPostMutation.Data(new AddPostMutation.CreatePost(
                "Post", "", "", "", "", "", null, null, 0
            ))
        )
        .enqueue(callback);

これは何をやってるのか
input を渡した後に create用のmodel も渡してる

mutate(@Nonnull Mutation<D, T, V> mutation, @Nonnull D withOptimisticUpdates, boolean isRetry)

これか

builder のところで埋まっていなければ こっちで埋める的な?

楽観アップデートの意味的には上書きアップデートかな
ただ、わざわざそんな挙動にはしなさそう

ありなしで保存される中身を見てみる

なしの場合、当たり前だけど nest してる部分には何も入らない

ありでやってみたけど、なしのときと変化がない。
やり方が悪いのか何なのか

同じようなことをしてるコードが見つけられない

未解決

再現コード書いて github の issue に起票するかな…

schemq の input の定義を変更して

$ amplify pull --restore
$ amplify codegen

すると
android/app/src/main/graphql/schema.json
ここに更新が入って、
その状態で build したら
nested の部分の class が更新された

それを使うと nested の部分も mutate 実行できた

schema.json
{
    "name": "Comment",
    "description": null,
    "args": [],
    "type": {
        "kind": "OBJECT",
        "name": "Comment",
        "ofType": null
    },
    "isDeprecated": false,
    "deprecationReason": null
},

こういうのが増えてた

input CreatePostInput {
	Id: String!
        TimeStampMs: Float!
	Comment: CommentInput
}

appsync の schema 定義はこんな感じで書けばいけた

このスクラップは4ヶ月前にクローズされました
ログインするとコメントできます