当前位置: 首页 > 知识库问答 >
问题:

如何用ArrayList字段迁移房间数据库?

娄德运
2023-03-14

已经创建了一个@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);
    }
}

共有1个答案

叶恩
2023-03-14

您似乎对多个变量使用了@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文件 谢谢你的时间和帮助。 我有以下错误: