【问题标题】:How to store custom nested objects in Room如何在 Room 中存储自定义嵌套对象
【发布时间】:2018-08-16 12:54:03
【问题描述】:

我想将此结构存储在 Room 数据库中,根 Object 是 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)

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    试试这个代码.. 首先像这样为模型类制作表格..

    @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);
    

    【讨论】:

      猜你喜欢
      • 2020-11-21
      • 2021-01-19
      • 2017-11-27
      • 2011-01-19
      • 2020-08-14
      • 1970-01-01
      相关资源
      最近更新 更多