代码之家  ›  专栏  ›  技术社区  ›  michasaucer

房间数据库-编辑实体

  •  1
  • michasaucer  · 技术社区  · 7 年前

    @Entity(tableName = "users")
    public class User {
    
    public User(String username, String email, String password){
        this.username = username;
        this.email = email;
        this.password = password;
    }
    
    public User() {}
    
    @PrimaryKey
    @ColumnInfo(name = "Username")
    private String username;
    
    @ColumnInfo(name = "Email")
    private String email;
    
    @ColumnInfo(name = "Password")
    private String password;
    
    //getters setters
    

    在此表格中:

    @Entity(tableName = "users")
    public class User {
    
    public User(String username, String email, String password){
        this.username = username;
        this.email = email;
        this.password = password;
    }
    
    public User() {}
    
    
    //changes here, move userId to int instead of username
    @NonNull
    @PrimaryKey(autoGenerate = true)
    private int id;
    
    @NonNull
    @ColumnInfo(name = "Username")
    private String username;
    
    @ColumnInfo(name = "Email")
    private String email;
    
    @ColumnInfo(name = "Password")
    private String password;
    
    //getters setters.
    

    这就是我的脸 RoomDatabase 类别:

    @Database(entities = {User.class}, version = 1)
    public abstract class ApplicationDatabase extends RoomDatabase {
    
    public abstract UserDao userDao();
    }
    

    我的问题是,当我编辑实体时,我的android设备中的数据库是否发生了变化?如果我的数据库中有数据呢?如果我需要先在设备上删除数据库?我的用户构造函数怎么样,它现在可以工作了?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Gal    7 年前

    编辑实体时,需要更改数据库的版本,在这种情况下,将注释更改为@database(entities={User.class},version=2)

    由您决定是删除数据库的旧数据,还是将旧版本迁移到新版本(如果您有一个用户群,并且您不希望他们丢失数据库中保存的数据,我建议您这样做,否则我建议您将信息删除到旧数据库中,因为这是一个更简单的解决方案)。

    如果您想进一步了解有关迁移房间数据库的信息,我添加了一个链接:

    https://developer.android.com/training/data-storage/room/migrating-db-versions

        2
  •  1
  •   ankuranurag2    7 年前

    正如您所提到的,在删除和重新创建数据库时没有任何问题。那么在这种情况下,只需添加 fallbackToDestructiveMigration() Room db builder类:

    Room.databaseBuilder(getApplicationContext(), MyDb.class, "database-name")
                .fallbackToDestructiveMigration()       //recreate DB in case of conflict due to cache/backup
                .build();
    

    这将在升级数据库版本时重新创建所有表,从而丢失以前的所有数据。

    MIGRATIONS 比如:

    static final Migration MIGRATION_1_2 = new Migration(1, 2) {
        @Override
        public void migrate(SupportSQLiteDatabase database) {
            database.execSQL("CREATE TABLE `Fruit` (`id` INTEGER, "
                    + "`name` TEXT, PRIMARY KEY(`id`))");
        }
    };
    
    Room.databaseBuilder(getApplicationContext(), MyDb.class, "database-name")
            .addMigrations(MIGRATION_1_2).build();