修改未加密Realm DB Schema导致加密DB被截断问题求助
可能的原因
Schema未隔离,共享所有
@RealmClass数据类
Realm默认会自动扫描所有带@RealmClass注解的数据类,并将它们加入每个Realm实例的Schema。如果创建DB1和DB2的RealmConfiguration时,没通过modules()指定专属Schema模块,两个数据库的Schema就会包含所有标注类。当DB1对应的数据类Schema变更后,DB2的Schema里也存在该类,Realm检测到本地Schema与代码中Schema不匹配,就会触发deleteRealmIfMigrationNeeded(),导致DB2也被截断重建。自定义RealmModule配置错误
若尝试过自定义RealmModule,但两个数据库都引用了同一个Module,或是Module错误包含了非对应数据库的数据类,也会造成Schema共享。比如同一个Module同时包含DB1和DB2的数据类,任意一个类的Schema变更都会影响两个库。DB2代码意外引用DB1修改的数据类
如果DB2的业务代码中不小心使用了DB1修改过的数据类(如查询、写入操作),Realm会自动将该类加入DB2的Schema。后续这个类的Schema变更时,DB2会检测到差异,触发数据库重建。
对应的解决方案
为每个数据库创建独立RealmModule
分别为DB1和DB2定义专属Module,用@RealmModule(classes = {})指定各自的数据类:// DB1专属Module @RealmModule(classes = {DB1DataClass1.class, DB1DataClass2.class}) public class DB1Module {} // DB2专属Module @RealmModule(classes = {DB2DataClass1.class, DB2DataClass2.class}) public class DB2Module {}然后在配置Realm时指定对应模块:
// DB1配置 RealmConfiguration db1Config = new RealmConfiguration.Builder() .name("db1.realm") .modules(new DB1Module()) .deleteRealmIfMigrationNeeded() .build(); // DB2配置 RealmConfiguration db2Config = new RealmConfiguration.Builder() .name("db2.realm") .encryptionKey(encryptionKey) .modules(new DB2Module()) .deleteRealmIfMigrationNeeded() .build();清理DB2代码中的无关引用
排查DB2相关业务代码,确保未使用DB1的数据类,避免Realm自动将这些类纳入DB2的Schema。禁用默认Schema扫描(可选)
若不需要全局默认Schema,可在Realm初始化时关闭自动扫描,强制使用自定义Module:Realm.init(context); RealmConfiguration baseConfig = new RealmConfiguration.Builder() .modules(Realm.getDefaultModule()) // 需保留默认模块时使用 .build(); Realm.setDefaultConfiguration(baseConfig);更推荐明确指定每个数据库的专属Module,避免依赖默认扫描逻辑。
内容的提问来源于stack exchange,提问作者Sai Deekshith

