根据 sub id 从 DataStore 下载选择性数据 Amplify

Download selective data from DataStore based on sub id Amplify

我只想根据用户子 ID 下载选择性数据,但 Amplify 允许我 运行 配置命令一次,selective syncing 用于此目的,我正在使用放大登录方法并从中获取 sub id,我只想根据 sub id 获取数据,但我必须重新配置 Amplify 所以这将基于该子 ID,但对于 Amplify Auth 服务,Amplify 已经配置,我无法添加基于子 ID

的配置

这是我在我的应用程序中使用的代码 class

/* Add the Amplify Plugins */
Amplify.addPlugin(AWSApiPlugin())
Amplify.addPlugin(AWSCognitoAuthPlugin())

Amplify.addPlugin(AWSDataStorePlugin.builder().dataStoreConfiguration(
    DataStoreConfiguration.builder()
        .syncExpression(Rooms::class.java) { Devices.SUB.ge(AwsConstants.AMPLIFY_SUB_ID) }
        .syncExpression(Scenes::class.java) { Devices.SUB.ge(AwsConstants.AMPLIFY_SUB_ID) }
        .syncExpression(Devices::class.java) { Devices.SUB.ge(AwsConstants.AMPLIFY_SUB_ID) }
        .syncExpression(Automations::class.java) { Devices.SUB.ge(AwsConstants.AMPLIFY_SUB_ID) }
        .syncExpression(MasterNodes::class.java) { Devices.SUB.ge(AwsConstants.AMPLIFY_SUB_ID) }
        .build()
).build())

Amplify.configure(applicationContext)

我只想添加配置以在准备好数据之前下载选择性数据

/* Starting the DataStore Syncing */
Amplify.DataStore.start(
    { Log.i(Constants.TAG_AMPLIFY, "DataStore started") },
    {}
)

我遇到了同样的问题。这是解决这个问题的关键概念。

尽管 Amplify.configure() 被调用 一次,但每次您启动数据存储时,您的 syncExpression 函数都会重新计算.

因此,全局设置子 ID(比如说 shred pref)并启动数据存储。

例如,

 Amplify.addPlugin(AWSDataStorePlugin.builder().dataStoreConfiguration(
                    DataStoreConfiguration.builder()
                            .syncExpression(Chef.class, () -> Chef.EMAIL.eq(getmailid("Chef")))
                            .syncExpression(Order.class, () -> Order.EMAIL.eq(getmailid("Order")))
                            .syncExpression(OrderDishes.class, () -> OrderDishes.EMAIL.eq(getmailid("OrderDishes")))
                            .syncExpression(Dish.class, () -> Dish.EMAIL.eq(getmailid("Dish")).or(isCustomer()))
                           // .syncExpression(Dish.class, () -> (isCustomer()))
                            .build())
                    .build());

稍后设置邮件 ID,然后在数据存储启动时再次调用 getmailid

所以在努力之后我发现只要我们调用 Amplify.DataStore.start() 方法就会重新评估 syncExpression,所以在这种情况下我们需要做的是我们必须使用所需的 syncExpressions 设置一次配置,所以每当我们调用 DataStore.start 时,它只是重新评估表达式,在调用 start 方法之前,我们只需要更新我们在 syncExpression 中使用的变量,所以我们的情况是 AwsConstants.AMPLIFY_SUB_ID