#amazon-dynamodb #synchronization #offline #aws-amplify #datastore
#amazon-dynamodb #синхронизация #Не в сети #aws-amplify #хранилище данных
Вопрос:
Я работаю над приложением списка покупок с 2 моделями: список продуктов и список покупок. Список покупок содержит много продуктов, и продукт принадлежит одному списку покупок.
# schema.graphql
type Product @model
{
id: ID!
groceryList: GroceryList @connection(name: "GroceryListProducts")
name: String!
}
type GroceryList @model {
id: ID!
name: String!
products: [Product] @connection(name: "GroceryListProducts")
}
Насколько я понимаю, в DynamoDB отношение «один ко многим» может быть запрошено с помощью глобального вторичного индекса и не будет напрямую отображаться в записях DynamoDB:
Таблица списка покупок DynamoDB:
╔═══════╦═════════╗
║ Id ║ Name ║
╠═══════╬═════════╣
║ L1 ║ List1 ║
║ L2 ║ List2 ║
║ L3 ║ List3 ║
╚═══════╩═════════╝
Таблица списка продуктов DynamoDB:
╔═════════╦═══════╦════════╗
║ Id ║ Name ║ PID* ║
╠═════════╬═══════╬════════╣
║ O1 ║ Orange║ L1 ║
║ O2 ║ Apple ║ L1 ║
║ O3 ║ Bacon ║ L2 ║
╚═════════╩═══════╩════════╝
*ProductGroceryListId
Когда я добавляю продукт и сохраняю его в хранилище данных, как показано ниже:
const productSaved = await DataStore.save(
new Product(product)
)
await DataStore.save(
GroceryList.copyOf(currentList, updated => {
updated.products = [...updated.products, productSaved]
}))
Экземпляр GroceryList в хранилище данных будет корректно отображать дочерние элементы products:
// GroceryList item showing on the browser DevTools, tab Application, IndexDB, amplify DataStore:
{
id: "L1"
name: "List1"
products: [
{id: "01", groceryList: {…}, name: "Orange"},
{id: "02", groceryList: {…}, name: "Apple"}
]
}
Однако, если я добавлю синхронизацию с облаком:
const subscription = DataStore.observe(Product).subscribe(msg => {
console.log(msg.model, msg.opType, msg.element);
})
Дочерние элементы исчезнут из экземпляра хранилища данных GroceryList.
Как я могу предотвратить это?
Я хотел бы убедиться, что могу использовать свое приложение как онлайн, так и офлайн.
Заранее благодарим вас за помощь!