Android Kotlin:Release版APK不显示Room与Firestore更新数据
解决Release版Room数据库新增字段不显示的问题
检查ProGuard/R8混淆规则
Release版默认开启代码混淆,要是Room的实体类、DAO类被混淆,字段映射肯定会出问题。直接在proguard-rules.pro里加这些规则:-keep class com.yourpackage.database.entity.** { *; } -keep interface com.yourpackage.database.dao.** { *; } -keep class androidx.room.** { *; } -keepclassmembers class * extends androidx.room.RoomDatabase { public static <T extends androidx.room.RoomDatabase> T create(...); } -keepattributes *Annotation*尤其是新增字段用了
@ColumnInfo或者序列化注解的话,必须保留注解不被混淆。验证Room数据库迁移逻辑
就算改了版本号,Release版的迁移说不定没跑起来。先试试在数据库构建时加fallbackToDestructiveMigration()强制重建数据库:Room.databaseBuilder(context, AppDatabase::class.java, "db_name") .fallbackToDestructiveMigration() .build()如果这么改后数据正常显示,说明你的Migration类有问题,得检查
addColumn语句的字段类型、名称是不是和实体类完全一致。排查Firestore到Room的数据映射
Release版里Gson这类序列化库可能因为混淆,导致Firestore的字段没法正确赋值给Room实体类。要是实体类用了@SerializedName映射Firestore的键名,得在混淆规则里加上-keepattributes SerializedName。
另外可以临时在Release版加日志(上线前记得删掉),打印从Firestore拿到的原始数据,还有存入Room前的实体对象,确认新增字段的值有没有被正确赋值。检查Room查询逻辑
看看DAO里的查询语句是不是包含了新增字段,别用SELECT *(虽然理论上能包含所有字段,但混淆后字段名变了就会出问题),最好明确写出需要查询的字段。也可以加日志打印Room查询的结果,确认有没有读到新增字段的值。
内容的提问来源于stack exchange,提问作者Hamza Saghir
相关产品推荐
相关产品推荐

