首页 > 解决方案 > 如何使用 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);
    }
}

标签: javaandroidsqliteandroid-room

解决方案


看来您已经使用@Embedded了多个变量。如果@Embedded注释了模型类的变量,则将其视为同一表的列。因此,对于相同类型的多个对象的情况,您应该使用TypeConverter可以将对象转换为 json 字符串的位置,同时保存并稍后作为对象检索。

不要制作嵌入式Player,而是为播放器创建类型转换器并使用它。通过这样做,您不必为播放器内的对象创建单独的类型转换器。


推荐阅读