Вот ссылка на мою структуру json. Я хочу кэшировать его с помощью Room ORM. Итак, я написал код ниже. Но когда я визуализировал свой экран, я заметил, что в каждом разделе есть только один вложенный элемент. Как видите, в каждом разделе должно быть более одного вложенного элемента. Я не могу сохранить массив объектов

Вот код объектов

@Entity(tableName = "calendar")
data class Calendar(
    @PrimaryKey val id: String,
    @ColumnInfo(name = "title") var title: String,
    @ColumnInfo(name = "start_time") var startTime: Long,
    @ColumnInfo(name = "end_time") var endTime: Long,
)


@Entity(tableName = "inspection_object",
    foreignKeys = [
        ForeignKey(
            parentColumns = ["id"],
            childColumns = ["calendar_id"],
            entity = Calendar::class,
            onDelete = ForeignKey.CASCADE,
            onUpdate = ForeignKey.CASCADE
        )
    ],
)
data class InspectionObj(
    @PrimaryKey val id: String,
    @ColumnInfo(name = "calendar_id") val calendarId: String,
    @ColumnInfo(name = "title") val title: String,
    @ColumnInfo(name = "address") val address: String,
    @ColumnInfo(name = "time") val time: Long,
    @ColumnInfo(name = "total_tasks") val totalTasks: Int,
    @ColumnInfo(name = "is_today") val isToday: Boolean,
    @ColumnInfo(name = "is_expired") val isExpired: Boolean,
    @ColumnInfo(name = "completed_tasks") val completedTasks: Int
)


data class CalendarWithObjects(
    @Embedded
    val calendar: Calendar,

    @Relation(parentColumn = "id", entityColumn = "calendar_id", entity = InspectionObj::class)
    val objects: List<InspectionObj>
)

Вот Дао

@Dao
abstract class CalendarDao {

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    abstract fun saveCalendar(calendar: Calendar)

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    abstract fun saveInspectionObject(inspectionObj: InspectionObj)

    @Query("delete from calendar")
    abstract fun deleteFromCalendar()

    @Query("delete from inspection_object")
    abstract fun deleteFromInspectionObject()

    @Transaction
    open fun insertCalendar(calendar: Calendar, inspectionObj: InspectionObj) {
        saveCalendar(calendar)
        saveInspectionObject(inspectionObj)
    }

    @Query("select count(*) from calendar")
    abstract fun selectCalendarRowsCount(): Int

    @Query("select * from calendar")
    abstract fun selectCalendarWithObjects(): List<CalendarWithObjects>
}
0
msfvenom 14 Окт 2020 в 17:40

1 ответ

Лучший ответ

Я не могу сохранить массив объектов

Для этого вам понадобится метод, который сохраняет список / массив объектов. У вас есть это:

@Insert(onConflict = OnConflictStrategy.REPLACE)
fun saveInspectionObject(inspectionObj: InspectionObj)

Похоже вам это нужно:

@Insert(onConflict = OnConflictStrategy.REPLACE)
fun saveInspectionObjectList(inspectionObjList: List<InspectionObj>) // or inspectionObjList: Array<InspectionObj>

Вы даже можете использовать следующую опцию, чтобы сохранить как Calendar, так и inspectionObjList:

@Insert(onConflict = OnConflictStrategy.REPLACE)
fun saveCalendarAndInspectionObjectList(calendar: Calendar, inspectionObjList: List<InspectionObj>)
0
sergiy tikhonov 14 Окт 2020 в 21:16