Android Studio中Room数据库无法保存问题求助
先修正数据库名称:Room会自动给数据库文件名加上
.db后缀,你手动添加后,实际生成的文件名会变成xxx.db.db,直接导致原有数据库无法被识别,新库初始化出现异常。把@Database注解里name字段的.db后缀删掉,恢复成原来的名称。检查Room实例是否为单例:如果你的Database类不是单例实现,多次创建实例会导致数据库文件被重复初始化甚至锁定,数据自然无法正常存储。可以用
@Singleton配合依赖注入,或者手写双重检查锁的单例逻辑,确保整个应用中只有一个Room数据库实例。处理插入时的主键冲突:日志提示“键已存在”,说明插入的行主键与现有数据重复。如果需要覆盖旧数据,把
insert()方法替换成insertOrReplace();如果要避免重复插入,先查询数据库中是否存在对应主键的数据,再决定是否执行插入操作,同时记得捕获SQLiteConstraintException,防止异常悄悄打断存储流程。验证真机存储路径:Room默认将数据库放在应用私有内部存储(
/data/data/你的包名/databases/),这个路径不需要申请存储权限,但如果自定义了存储路径,要注意Android 10及以上版本的Scoped Storage规则,必须使用应用可访问的私有目录,不要向公共存储目录写入数据。解决数据库版本混乱问题:之前修改库名、删除旧库导致的崩溃,是Room版本控制未处理好导致的。如果不需要保留旧数据,直接调高
@Database注解中的version参数,然后在构建Database实例时添加.fallbackToDestructiveMigration(),让Room在版本升级时直接销毁旧表并重建新表。重新同步App Inspector:有时候App Inspector显示数据库为空,是因为未及时刷新或连接了旧进程。先卸载应用,清理Android Studio缓存,重启App Inspector后重新运行应用,再查看数据库内容。
内容的提问来源于stack exchange,提问作者DrBagel

