DynamoDB已删除项在DataStore查询中仍返回,如何彻底清除残留数据
这是AWS Amplify DataStore的本地持久化缓存机制导致的:DataStore会默认在用户设备本地存储一份数据副本,你直接在AdminUI界面、DynamoDB云端手动删除数据的操作,不会主动触发本地缓存的同步更新,因此旧的已删除数据仍然保留在本地,查询时会优先返回本地缓存的内容。
解决方法
- 临时解决:清理本地缓存
开发阶段最快的处理方式是直接卸载重装APP,本地缓存会被完全清除。如果需要代码实现,可以在查询前调用DataStore.clear()方法清空本地缓存,强制DataStore从云端重新拉取最新数据,修改后的代码参考:
useEffect(() => { const getCurrentUser = async () => { // 清空本地缓存,触发全量同步 await DataStore.clear(); const userId = await Auth.currentAuthenticatedUser(); const dbUsers = await DataStore.query(User, uzer => uzer.sub('eq', userId.attributes.sub), ); console.warn(dbUsers); }; getCurrentUser(); }, []);
注意生产环境不要频繁调用DataStore.clear(),会增加云端请求量、影响加载性能,建议仅在用户登出、APP首次启动等场景调用。
长期方案:规范删除操作
Amplify DataStore默认启用软删机制,直接在DynamoDB硬删记录的操作无法被DataStore的同步逻辑识别,会导致本地和云端数据不一致。后续删除数据建议走官方流程:要么通过AdminUI的删除按钮操作,要么调用DataStore.delete(记录实例)方法触发删除,会自动标记_deleted字段为true,同步到所有端的缓存,后续同步时会自动清理该记录。可选:关闭软删机制
如果你不需要软删功能,可以在Amplify的Schema定义中,给对应模型的@model注解配置关闭软删,示例:
type User @model(softDelete: false) { id: ID! sub: String! name: String # 其他字段 }
配置后删除操作会直接硬删记录,不会保留_deleted标记的残留数据。
内容的提问来源于stack exchange,提问作者Omer Messing
相关产品推荐
相关产品推荐

