已经创建了一个@Embedded类播放器。我想在其中添加ArrayList字段,该字段使用@TypeConverters,它在保存时将列表转换为Gson,在加载时将其转换为Gson。请告诉我如何在void migrate()
方法中请求将列表添加到Player类的现有实例中。
@Database(entities = {Save.class}, version = 2)
public abstract class AppDatabase extends RoomDatabase {
public static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(final SupportSQLiteDatabase database) {
database.execSQL("ALTER TABLE Save ADD COLUMN trainingPower
INTEGER DEFAULT 5 NOT NULL");
}
};
}
public class Player
{
@TypeConverters({AlbumsListConverter.class})
private List<Albums> albumsList = new ArrayList();
@Embedded(prefix="energy_")
public Skills energy;
public int energyCount;
public int energyMax = 50;
public String fameName;
@Embedded(prefix="flow_")
public Skills flow;
public int imageID;
int imagePers;
@Embedded(prefix="mast_")
public Skills mastering;
@Embedded(prefix="mast2_")
public Skills mastering2;
private long money = 50;
@Embedded(prefix="music_")
public Skills music;
private String name;
public int ratingPosition = 1;
public int reclameToken = 0;
@TypeConverters({TrackListConverter.class})
public List<Tracks> releaseList = new ArrayList();
@TypeConverters({MessagesConverter.class})
public List<Massages> messagesList = new ArrayList<>();
private long reputation = 0;
private int respect = 1;
...
}
类保存:
@Entity
public class Save
{
@TypeConverters({ArrayConverter.class})
public String[] AllTopicTracks;
@Embedded
private Player actor;
...
}
TypeConverter:
public class MessagesConverter {
@TypeConverter
public String fromMassagesList(List<Messages> messages)
{
Gson gson = new Gson();
return gson.toJson(messages);
}
@TypeConverter
public List<Messages>toMessagesList(String data)
{
Gson gson = new Gson();
Type type = new TypeToken<List<Messages>>(){}.getType();
return gson.fromJson(data,type);
}
}
您似乎对多个变量使用了@embedded
。如果对@embedded
进行了注释,model类的变量将被视为同一个表的列。因此,对于同一类型的多个对象的情况,您应该使用typeConverter
,其中对象可以在保存时转换为json字符串,然后作为对象检索。
与其制作嵌入式player
,不如为player创建类型转换器并使用它。通过这样做,您不必为Player内的对象创建单独的类型转换器。
并且我发现了基于数据库版本4的可能场景的迁移varargs。 我的问题是,假设我使用的是db v1的Room,当我的应用程序到达db v10时,我将不得不编写多少迁移方法? 在sqlite中,我们在中获得已安装应用程序的当前db版本,我们只需通过开关大小写而不使用break语句,以便满足所有db升级。
https://medium . com/Google-developers/understanding-migrations-with-room-f01e 04 b 07929上有一篇关于房间迁移的很棒的文章 然而,我仍然错过了房间中的“灾难”恢复机制(例如,当发生异常情况时,将清除并重新创建数据库的fallbackToDestructiveRecreationOnMigrationError(
获取以下异常: 预期: TableInfo{name='chat_table',Columns={message=column{name='message',type='text',affinity='2',notnull=false,primarykeyposition=0},messageStatus=column{name='message status',type='text',affin
在构建Room数据库之前,我尝试保留旧的SqliteOpenHelper并使用它从1升级到3。这在第一次运行时有效,但随后的运行会使SqliteOpenHelper崩溃,因为它不能降级数据库(Room成功升级到v4,但open helper只知道v3。使用它来确保升级到v3的数据库会导致它尝试降级)
我需要你的帮助。我试图在没有反序列化的情况下找到解决方案,但我什么也没找到。如果你能帮我就好了...所以我有了下面的JSON文件 谢谢你的时间和帮助。 我有以下错误: