有两张table的房间实体?

rqqzpn5f  于 2021-09-29  发布在  Java
关注(0)|答案(1)|浏览(313)

是否可以创建具有两个表的房间图元?我知道存储重复数据不是最佳做法,但我需要一个备份表将数据恢复到原始状态。

@Entity(tableName = "models", "backupModels")
public class Entity {

    @PrimaryKey
    @ColumnInfo(name = "id")
    private int id;

    @ColumnInfo(name = "model")
    private String model;

    public Entity() {

    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getModel() {
        return model;
    }

    public void setModel(String model) {
        this.model = model;
    }
}
yks3o0rb

yks3o0rb1#

是否可以创建具有两个表的房间图元?
否@实体仅定义一个表。
您可以通过重命名类并使用另一组dao来复制实体。
但是,如果只是为了后面的目的,那么不妨考虑下面的工作示例(设计为只运行一次)。
这是基于创建表的吗?作为select语句,对于restore insert into table select。。。;
您只需要不做任何更改的单个实体(除去第二个表名除外)。实体:-

@androidx.room.Entity(tableName = "models"/* can't do, "backupModels"*/)
public class Entity {

    @PrimaryKey
    @ColumnInfo(name = "id")
    private int id;

    @ColumnInfo(name = "model")
    private String model;

    public Entity() {

    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getModel() {
        return model;
    }

    public void setModel(String model) {
        this.model = model;
    }
}

一个非常基本的@dao-alldao(允许演示):-

@Dao
abstract class AllDao {

    @Insert
    abstract long insert(Entity entity);

    @Query("SELECT * FROM models")
    abstract List<Entity> getAllModels();
}

备份/还原代码在@database数据库中编码:-

@Database(entities = {Entity.class},version = 1)
abstract class TheDatabase extends RoomDatabase {
    abstract AllDao getAllDao();

    private static final String SUFFIX_BACKUP = "_backup", SUFFIX_OLD = "_old";

    private static volatile TheDatabase instance = null;

    public static TheDatabase getInstance(Context context) {
        if (instance == null) {
            instance = Room.databaseBuilder(context,TheDatabase.class,"my.db")
                    .allowMainThreadQueries()
                    .build();
        }
        return instance;
    }

    public static void backupTable(String table) {
        SupportSQLiteDatabase db = instance.getOpenHelper().getWritableDatabase();
        db.beginTransaction();
        db.execSQL("DROP TABLE IF EXISTS `" + table + SUFFIX_BACKUP + "`;");
        db.execSQL("CREATE TABLE `" + table + SUFFIX_BACKUP + "` AS SELECT * FROM `" + table + "`");
        db.setTransactionSuccessful();
        db.endTransaction();
    }

    public static void restoreTable(String table) {
        SupportSQLiteDatabase db = instance.getOpenHelper().getWritableDatabase();
        db.beginTransaction();
        db.execSQL("DROP TABLE IF EXISTS `" + table + SUFFIX_OLD + "`");
        db.execSQL("CREATE TABLE `" + table + SUFFIX_OLD + "` AS SELECT * FROM `" + table +"`;");
        db.execSQL("DELETE FROM `" + table + "`;");
        db.execSQL("INSERT INTO `" + table + "` SELECT * FROM `" +table + SUFFIX_BACKUP + "`;");
        db.execSQL("DROP TABLE IF EXISTS `" + table + SUFFIX_OLD + "`;");
        db.setTransactionSuccessful();
        db.endTransaction();
    }
}

注意 restorebackup 方法可以适应任何表格。但是,可能必须考虑遵守约束(例如,如果使用外键约束)。
还原方法创建进一步的备份(可选)作为以防万一的备份(旧型号)。 DROP ping models_old table是可选的。
将所有内容放在一起并进行演示是主要活动:-

public class MainActivity extends AppCompatActivity {

    TheDatabase db;
    AllDao dao;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        db = TheDatabase.getInstance(this);
        dao = db.getAllDao();

        Entity e = new Entity();
        e.setId(1);
        e.setModel("Model1");
        dao.insert(e);
        TheDatabase.backupTable("models");
        e.setId(2);
        e.setModel("Model2");
        dao.insert(e);
        for(Entity entity: dao.getAllModels()) {
            Log.d("PRERESTORE","ID = " + entity.getId() + " Model = " + entity.getModel());
        }
        TheDatabase.restoreTable("models");
        for(Entity entity: dao.getAllModels()) {
            Log.d("POSTRESTORE","ID = " + entity.getId() + " Model = " + entity.getModel());
        }
    }
}

因此:-
向“模型”表中添加一行。
做备份。
将第二行添加到“模型”表中。
将模型表的内容写入日志(2行)。
恢复模型表(当存在一行时)。
将restore models表的内容写入日志(1行)。
结果
运行时,日志包括:-

2021-07-27 07:41:11.991 D/PRERESTORE: ID = 1 Model = Model1
2021-07-27 07:41:11.992 D/PRERESTORE: ID = 2 Model = Model2

2021-07-27 07:41:11.996 D/POSTRESTORE: ID = 1 Model = Model1

注意:使用时请考虑限制。 CREATE TABLE ... AS SELECT ....

相关问题