java - 如何使用 ArrayList 字段迁移 Room 数据库?
问题描述
已经创建了一个 @Embedded 类 Player。我想向其中添加 ArrayList字段,该字段使用@TypeConverters,它在保存时将我的 List 转换为 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;
...
}
类型转换器:
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
注释了模型类的变量,则将其视为同一表的列。因此,对于相同类型的多个对象的情况,您应该使用TypeConverter
可以将对象转换为 json 字符串的位置,同时保存并稍后作为对象检索。
不要制作嵌入式Player
,而是为播放器创建类型转换器并使用它。通过这样做,您不必为播放器内的对象创建单独的类型转换器。
推荐阅读
- d3.js - d3.csv 加载数据显示未定义
- ios - 如何从 RPScreenRecorder 获取视频或添加分享按钮?
- visual-studio-code - 如何在 Visual Studio Code 中重新映射默认的 CTRL+f(查找),以便我可以像在 unix/linux 中那样使用 CTRL+f?
- c++ - 递归函数 - 楼梯
- machine-learning - 语音识别中的置信度分数是什么意思?
- android - Android - 如何将函数传递给 Activity?
- python - tkinter 文本和单选按钮小部件
- javascript - AmCharts 4 当系列没有价值时打破
- c++ - 在 C++ 的 STL List 中使用排序功能时遇到问题,我该如何改进?
- c++ - 无法弄清楚弹弓所需的二次曲线背后的数学