AWS Amplify如何限制observeQuery返回结果 仅监听表最新10条数据更新
AWS Amplify DataStore observeQuery 限制监听条数方案
问题说明
Amplify.DataStore.observeQuery() 原生未提供直接传入limit参数的能力,所以默认会返回全表同步到本地的所有数据,和query接口的能力存在差异。
可选实现方案
方案1:流层裁剪(推荐绝大多数场景使用)
你已经配置了按时间倒序排序,只需对返回的流做一层map转换,裁剪掉10条以外的历史数据即可,代码改动极小:
Stream<QuerySnapshot<Actuality>> getActualityStream() { return Amplify.DataStore.observeQuery( Actuality.classType, sortBy: [Actuality.DATE.descending()], ).map((originalSnapshot) { // 仅保留排序后的前10条最新数据 final filteredItems = originalSnapshot.items.take(10).toList(); return QuerySnapshot( items: filteredItems, isSynced: originalSnapshot.isSynced, syncProgress: originalSnapshot.syncProgress, ); }); }
- 优点:无需调整后端配置、不影响其他业务逻辑的DataStore查询
- 注意:底层还是会全量同步表数据到本地存储,若表数据量级超过10万条建议使用方案2
方案2:全局同步规则限制
如果表数据量极大,不想全量同步到本地,可以在Amplify初始化时配置syncExpression同步规则,仅同步符合条件的部分数据到本地:
final dataStorePlugin = AmplifyDataStore( modelProvider: ModelProvider.instance, syncExpressions: [ // 限制Actuality表仅同步最近30天的数据 DataStoreSyncExpression( Actuality.classType, Actuality.DATE.gt(DateTime.now().subtract(const Duration(days: 30))), ) ], ); await Amplify.addPlugins([dataStorePlugin, AmplifyAPI()]); await Amplify.configure(amplifyconfig);
配置后observeQuery只会拿到同步到本地的30天内数据,再配合方案1的流层take(10),即可实现完全的限制效果。
- 注意:syncExpression是全局生效的规则,配置后所有对Actuality表的DataStore操作都只能拿到同步范围内的数据,若其他业务需要查询更早的历史数据则不适用该方案。
内容的提问来源于stack exchange,提问作者Eng
相关产品推荐
相关产品推荐

