Flutter中Realm报错‘unable to decrypt after 0 seconds’求助
Flutter Realm插入数据触发DecryptionFailed错误的解决方案
以下是针对你遇到的realm::util::DecryptionFailed错误的排查和解决步骤:
1. 检查加密密钥的合法性与一致性
Realm加密要求密钥必须是64字节(512位)的随机二进制数据,且必须和创建数据库时使用的密钥完全一致:
- 确认
rawKey的长度是否为64字节,长度不符会直接导致解密失败; - 若数据库从其他设备/环境迁移而来,确保密钥完全同步,包括字节顺序、编码方式(避免字符串转字节时出现编码错误)。
2. 修复Configuration配置的语法错误
你的配置代码中shouldDeleteIfMigrationNeeded: ,缺失布尔值参数(需传入true或false),这会导致配置初始化异常,间接影响加密逻辑。修正后的配置示例:
var config = Configuration.local( schemas, encryptionKey: rawKey, path: "$_dbPath/${dbType.name}.realm", schemaVersion: odaSchemaVersion, shouldDeleteIfMigrationNeeded: true, // 根据业务需求选择true或false shouldCompactCallback: (_forServer ? (totalSize, usedSize) => true : null), );
3. 验证数据库文件状态
如果数据库文件是未加密状态下创建的,或者文件已损坏,添加加密密钥后会触发解密错误:
- 删除目标路径下的现有
.realm文件(路径为"$_dbPath/${dbType.name}.realm"),让Realm使用当前加密密钥重新创建数据库; - 若数据库是从外部导入的,确认导入的文件是用相同密钥加密的合法Realm文件。
4. 确保Realm实例的线程使用正确
Realm实例不能跨线程使用,确认你的realm实例是在当前UI线程(错误日志中的io.flutter.1.ui线程)初始化的,若需在其他线程操作,使用Realm.withConfig在目标线程重新初始化实例。
5. 重新生成加密密钥(终极排查步骤)
如果以上步骤都无效,尝试重新生成合规的加密密钥并重建数据库:
// 生成64字节的随机加密密钥 final rawKey = List<int>.generate(64, (i) => Random.secure().nextInt(256));
删除旧数据库文件后,用新密钥初始化Realm,再执行插入操作验证是否解决问题。
内容的提问来源于stack exchange,提问作者Thanapon Makmesup
相关产品推荐
相关产品推荐

