如何在房间中存储自定义嵌套对象

时间:2018-08-16 12:54:04

标签: android kotlin nested android-room android-architecture-components

我想将此结构存储在Room数据库中,根对象是ScheduleModel。 尝试使用@Entity和@PrivateKey后,出现error: Cannot figure out how to save this field into database.错误。

谢谢。

data class ScheduleModel(
        val data: Data
)

data class Class(
        @PrimaryKey val id: Int,
        val name: String,
        val number: Int,
        val level: String,
        val schedule: List<Schedule>)

data class Data(
        @SerializedName("student") val classById: Class)

data class Lesson(
        val title: String,
        val icon: String)

data class Schedule(
        val index: String,
        val lesson: Lesson,
        val location: Any)

2 个答案:

答案 0 :(得分:0)

您必须将不同的类型保存在不同的表中,并使用一对一或一对多交互。 例如:在ScheduleModel房间对象中,您保留Data的ID并从Data表中获取它。在教室对象中,您可以保存Shedules的ID等的列表。

答案 1 :(得分:-1)

尝试此代码。 首先用这种方式为模型类制作表格。

@Entity
public class MyTable {
@PrimaryKey(autoGenerate = true)

private int id;
public int getId() {
    return id;
}

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

private double ItemPrice;

public double getItemPrice() {
    return ItemPrice;
}

public void setItemPrice(double itemPrice) {
    ItemPrice = itemPrice;
}
}

之后,使dao类以这种方式执行CRUD操作。

@Dao
public interface MyTableDao {
@Insert
void insertData(MyTable myTable);

@Query("SELECT * FROM MyTable where id=:id and ItemPrice=:price")
List<MyTable> getData(int id,int price);

}

制作用于访问dao的数据库类,并定义数据库名称和版本。.

@Database(entities = {MyTable.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract MyTableDao getTableDao();
}

定义应用活动..

public class AppActivity extends Application {

static AppDatabase db;

@Override
public void onCreate() {
    super.onCreate();
    db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "database-name").build();
}

public static AppDatabase getDatabase() {
    return db;
}
}

此活动定义到android清单文件中,变成应用程序标签之类。

    android:name=".db.AppActivity"

在调用活动或类似片段之后。

        myTable.setItemPrice(200);
    appDatabase.getTableDao().insertData(myTable);