已配置Auth的Amplify如何基于用户sub id实现DataStore选择性数据下载
Amplify DataStore动态按用户sub id同步数据实现方案
实现逻辑
Amplify仅支持全局执行一次configure命令,不需要在初始化阶段就确定同步用的sub id值,利用同步表达式的惰性执行特性即可实现动态按登录用户同步数据:
1. 调整初始化阶段的同步表达式配置
将静态常量取值改为动态获取当前登录用户的sub id,不需要提前写死固定值:
/* 添加Amplify插件 */ Amplify.addPlugin(AWSApiPlugin()) Amplify.addPlugin(AWSCognitoAuthPlugin()) Amplify.addPlugin(AWSDataStorePlugin.builder().dataStoreConfiguration( DataStoreConfiguration.builder() .syncExpression(Rooms::class.java) { val currentUserSub = Amplify.Auth.currentUser?.userId ?: "" Devices.SUB.ge(currentUserSub) } .syncExpression(Scenes::class.java) { val currentUserSub = Amplify.Auth.currentUser?.userId ?: "" Devices.SUB.ge(currentUserSub) } .syncExpression(Devices::class.java) { val currentUserSub = Amplify.Auth.currentUser?.userId ?: "" Devices.SUB.ge(currentUserSub) } .syncExpression(Automations::class.java) { val currentUserSub = Amplify.Auth.currentUser?.userId ?: "" Devices.SUB.ge(currentUserSub) } .syncExpression(MasterNodes::class.java) { val currentUserSub = Amplify.Auth.currentUser?.userId ?: "" Devices.SUB.ge(currentUserSub) } .build() ).build()) Amplify.configure(applicationContext)
2. 登录成功后刷新DataStore同步
如果登录前已经启动过DataStore,登录完成后先清空本地缓存再重启DataStore即可触发新的同步规则生效:
/* 启动DataStore同步 */ Amplify.DataStore.clear( { Amplify.DataStore.start( { Log.i(Constants.TAG_AMPLIFY, "DataStore 启动完成") }, { error -> Log.e(Constants.TAG_AMPLIFY, "DataStore 启动失败", error) } ) }, { error -> Log.e(Constants.TAG_AMPLIFY, "DataStore 缓存清空失败", error) } )
说明
- 同步表达式仅在DataStore启动执行同步操作时才会计算内部取值,初始化configure阶段不会执行,无需在初始化时就确定sub id的具体值
- 无需重复执行Amplify的configure命令,所有动态业务逻辑可以放在同步表达式的闭包内实时计算
内容的提问来源于stack exchange,提问作者Zubair Akber
相关产品推荐
相关产品推荐

