Flutter中Sembast数据库更新值问题:无法覆盖现有记录
Sembast数据库更新密钥的正确方法
首先,你的put方法写法本质是正确的——Sembast中store.record(key).put(db, value)会自动判断:如果该key对应的记录存在就更新,不存在才新增。如果你的代码出现新增而非更新的情况,大概率是因为初始存储时没有用相同的key(user_key)创建记录,或者数据库路径有误导致操作的不是同一个数据库文件。
另外,你注释掉的update方法写法有误:update的第二个参数需要传入键值对Map(它用于更新记录中的指定字段),而不是直接传字符串值。针对你的场景,正确的update用法可以这样写:
String dbPath = 'db.db'; DatabaseFactory dbFactory = databaseFactoryIo; Future replaceKey(String k) async { Database db = await dbFactory.openDatabase(dbPath); var store = StoreRef.main(); // 方法1:使用put(推荐,自动处理新增/更新逻辑) await store.record('user_key').put(db, k); // 方法2:使用update(需确保记录已存在,否则不会执行操作) // await store.update(db, {'value': k}, finder: Finder(filter: Filter.byKey('user_key'))); }
排查要点
- 检查初始存储密钥的代码,确保是用
store.record('user_key').put(db, '初始值')创建的记录,而非store.add(db, {'key':'user_key', 'value':'初始值'})——后者会生成自动递增的整数key,导致后续put找不到对应记录,从而触发新增逻辑。 - 确认
dbPath路径正确,保证每次打开的是同一个数据库文件。
内容的提问来源于stack exchange,提问作者Marko LizZo
相关产品推荐
相关产品推荐

