如何从dynamodb后端观察Android aws amplify的变化?

问题描述 投票:0回答:1

我使用 android amplify 创建了一个用于 aws amplify 的移动应用程序。我的要求是观察发电机数据库中的实时变化,或者直接通过任何其他应用程序的脚本或直接在控制台上观察。 当我从移动客户端添加一些数据时,它会添加到 dynamo 数据库中,并将更改后的数据返回到我的观察方法,但是当有人直接在控制台中更改或编辑数据时,我无法观察到它。如何做它 ?我的代码如下

 package com.example.appsyncdynamodb

import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.util.Log
import android.view.View
import android.widget.Button
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.amplifyframework.api.graphql.model.ModelQuery
import com.amplifyframework.api.graphql.model.ModelSubscription
import com.amplifyframework.core.Action
import com.amplifyframework.core.Amplify
import com.amplifyframework.core.Consumer
import com.amplifyframework.core.async.Cancelable
import com.amplifyframework.core.model.query.ObserveQueryOptions
import com.amplifyframework.core.model.query.predicate.QueryPredicate
import com.amplifyframework.datastore.DataStoreException
import com.amplifyframework.datastore.DataStoreItemChange
import com.amplifyframework.datastore.DataStoreQuerySnapshot
import com.amplifyframework.datastore.generated.model.Todo

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContentView(R.layout.activity_main)
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }
        Amplify.DataStore.start({},
        {})
        val btn:Button = findViewById(R.id.btn)
        var i : Int=0
        btn.setOnClickListener {
            i += 1;
            Log.d("printed inside","inside")

            //your implementation goes here
            val item = Todo.builder()
                .name("Todo").description("Hello Vibhor")
                .build()

            Amplify.DataStore.save(item,
                { Log.i("Tutorial", "Saved item: ${item.toString()}") },
                { Log.e("Tutorial", "Could not save item to DataStore", it) }
            )
        }
        Log.d("printed outside","outside")


        val subscription = Amplify.API.subscribe(
            ModelSubscription.onUpdate(Todo::class.java),
            { Log.d("ApiQuickStart", "Subscription established") },
            { Log.d("ApiQuickStart", "Todo update subscription received:$it") },
            { Log.d("ApiQuickStart", "Subscription failed", it) },
            { Log.d("ApiQuickStart", "Subscription completed") }
        )

        Amplify.DataStore.observe(Todo::class.java,
            { Log.i("MyAmplifyApp", "Observation began") },
            {
                val post = it.item()
                Handler(Looper.getMainLooper()).post {
                    Toast.makeText(this, it.item().toString(), Toast.LENGTH_LONG).show()
                }
                Log.i("MyAmplifyAppobs", "Post: $post")
            },
            { Log.e("MyAmplifyApp", "Observation failed", it) },
            { Log.i("MyAmplifyApp", "Observation complete") }
        )

        val subscription2 = Amplify.API.subscribe(
            ModelSubscription.onCreate(Todo::class.java),
            { Log.d("ApiQuickStart", "Subscription established") },
            { Log.d("ApiQuickStart", "Todo create subscription received:$it") },
            { Log.d("ApiQuickStart", "Subscription failed", it) },
            { Log.d("ApiQuickStart", "Subscription completed") }
        )

        val tag = "ObserveQuery"
        val onQuerySnapshot: Consumer<DataStoreItemChange<Todo>> =
            Consumer<DataStoreItemChange<Todo>> { value: DataStoreItemChange<Todo> ->
                Log.d(tag, "success on snapshot")
                Log.d(tag, "records: $value")
                //Log.d(tag, "number of records: " + value.items.size)
                //Log.d(tag, "sync status: " + value.isSynced)
            }

        val observationStarted =
            Consumer { _: Cancelable ->
                Log.d(tag, "success on cancelable")
            }
        val onObservationError =
            Consumer { value: DataStoreException ->
                Log.d(tag, "error on snapshot $value")
            }
        val onObservationComplete = Action {
            Log.d(tag, "complete")
        }
       val predicate: QueryPredicate =
            Todo.NAME.beginsWith("Build")
//        val querySortBy = QuerySortBy("post", "rating", QuerySortOrder.ASCENDING)

//        val options = ObserveQueryOptions(predicate,null)
//        Amplify.DataStore.observeQuery(
//            Todo::class.java,
//            options,
//            observationStarted,
//            onQuerySnapshot,
//            onObservationError,
//            onObservationComplete
//        )


        Amplify.API.query(
            ModelQuery.list(Todo::class.java),
            { response ->
                response.data.forEach { todo ->
                    Log.i("Query++", todo.name)
                }
            },
            { Log.e("MyAmplifyApp", "Query failure", it) }
        )

        Amplify.DataStore.observe(
            {Log.d("Observe", "Observation started established")},
            {
                Handler(Looper.getMainLooper()).post {
                    Toast.makeText(this, it.item().toString(), Toast.LENGTH_LONG).show()
                }
                Log.d("item change", "item change"+it.item().toString())},
            {},
            {}
        )
    }
}
android amazon-dynamodb aws-appsync
1个回答
0
投票

如果不明确阅读,您无法观察 DynamoDB 中不是通过 Amplify 进行的项目更改。

© www.soinside.com 2019 - 2024. All rights reserved.