我使用 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())},
{},
{}
)
}
}
如果不明确阅读,您无法观察 DynamoDB 中不是通过 Amplify 进行的项目更改。