是否可以将同一对象保存到两个不同的表Room中?

时间:2018-07-31 14:50:27

标签: java android android-room

假设我有obj

class Human{
List<Car> demagedCars = new ArrayList();
List<Car> newCars = new ArrayList();
}

@Entity(tableName = "carstable")
class Car{
@PrimaryKey(autogenerate = true)
public long id;

public String name;
}

因此,房间将创建一个名称为carstable的表,我将从两个列表newCarsdemagedCars中保存对象到该表

如何将其恢复为两个列表?

我认为可以创建两个表demagedcarstablenewcarstable

然后根据列表demagedCarsdemagedcarstablenewCarsnewcarstable保存

但是据我所知,没有空间为表创建空间了吗?

我不想改变我的对象...

我所需要做的就是在一个数据库中创建2个表。当我得到demagedCars的清单时,我只需要告诉他I want you to save to demagedcarstable,而当我得到newCars的清单时,我便告诉他I want you to save to newcarstable。因此,我有1个数据库和2个表,并且要由我决定保存此Car对象的位置。问题是:可能吗?

随时提问

2 个答案:

答案 0 :(得分:1)

从结构的角度来看,我相信您应该将它们全部存储在同一张表中,例如 carsTable ,并将状态字段添加到car对象。然后,您可以查询 carsTable 并使用该状态字段在WHERE子句中过滤结果。

编辑:

从RoomDB的角度来看,您的查询如下所示:

@Query("SELECT * FROM carsTable WHERE status = :status")
public Car[] findCarsByStatus(String status);

答案 1 :(得分:0)

对于同一对象,您可以拥有尽可能多的空间数据库

@Database(entities = Car.class, version = 1, exportSchema = false)
public abstract class newCarsDatabase extends RoomDatabase {
private static final String LOG_TAG = newCarsDatabase.class.getSimpleName();
private static final Object LOCK = new Object();
private static newCarsDatabase sInstance;

public static newCarsDatabase getInstance(Context context) {
    if (sInstance == null) {
        synchronized (LOCK) {
            Log.e(LOG_TAG, "creating new database");
            String databaseName = "new_cars";
            sInstance = Room.databaseBuilder(context.getApplicationContext(), newCarsDatabase.class, databaseName).build();
        }
    }
    Log.e(LOG_TAG, "Getting the database instance");
    return sInstance;
}

public abstract CarsDao favDao();
}  

对于受损的人

 @Database(entities = Car.class, version = 1, exportSchema = false)
public abstract class demagedCarsDatabase extends RoomDatabase {
private static final String LOG_TAG = demagedCarsDatabase.class.getSimpleName();
private static final Object LOCK = new Object();
private static demagedCarsDatabase sInstance;

public static demagedCarsDatabase getInstance(Context context) {
    if (sInstance == null) {
        synchronized (LOCK) {
            Log.e(LOG_TAG, "creating new database");
            String databaseName = "damaged_cars";
            sInstance = Room.databaseBuilder(context.getApplicationContext(), demagedCarsDatabase.class, databaseName).build();
        }
    }
    Log.e(LOG_TAG, "Getting the database instance");
    return sInstance;

}

public abstract CarsDao DamagedDao();
}

此外,您可以简单地将数据添加到每个数据中,即可对两个数据使用相同的Dao,或者如果您希望为每个数据创建Dao,但由于您只有一个班级,我建议您制作一个道为他们俩