Вставить объект внутри объекта с помощью библиотеки персистентности комнаты Android - PullRequest
0 голосов
/ 11 мая 2018

Каталог

@Entity(tableName = "directory")
class Directory(@PrimaryKey(autoGenerate = false) var id: Int? = null,
                @ColumnInfo(name = DIR_NAME) var dirName: String? = null,
                @Ignore var dirImages: List<Images>? = null

) : Serializable {
    companion object {
        const val DIR_NAME = "dirName"
        const val DIR_IMAGES = "dirImages"
    }
}

Изображение модели

@Entity(foreignKeys = arrayOf(ForeignKey(entity = Directory::class,
        parentColumns = arrayOf("id"),
        childColumns = arrayOf("id"),
        onDelete = ForeignKey.CASCADE)))

data class Images(
        @PrimaryKey(autoGenerate = false) val id: Int? = null,
        @ColumnInfo(name = "image") val images: String
) {

}

Справочник Дао

@Dao
interface DirectoryDao {

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertAll(directory: ArrayList<Directory>?)

}

Как вставить список изображений в каталог? Должен ли я создать отдельный Дао для изображений?

1 Ответ

0 голосов
/ 21 мая 2018

Почему бы не сделать свой список изображений простым списком строк?(Вы можете использовать typealias в kotlin, если хотите придерживаться изображения)

У вас есть 2 варианта, в зависимости от того, как вам нужен доступ к вашим Image объектам.Вы в порядке, чтобы получить список изображений только из вашего объекта Directory , или вам нужны некоторые запросы к вашим изображениям в БД?(например, count, findBy и т. д.)

1-й вариант , если вы просто хотите получить список изображений в вашем объекте Directory (вероятно, лучший для вашего случая):

@Entity(tableName = "directory")
class Directory(@PrimaryKey(autoGenerate = false) var id: Int,
                @ColumnInfo(name = DIR_NAME) var dirName: String,
                @ColumnInfo(name = "images")
                @TypeConverters(ImagesConverters::class)
                 var dirImages: List<Images>)

где ImagesConverters.kt :

public class ImagesConverters {

    /**
     * Convert a a list of Images to a Json
     */
    @TypeConverter
    fun fromImagesJson(stat: List<Images>): String {
        return Gson().toJson(stat)
    }

    /**
     * Convert a json to a list of Images
     */
    @TypeConverter
    fun toImagesList(jsonImages: String): List<Images> {
        val notesType = object : TypeToken<List<Images>>() {}.type
        return Gson().fromJson<List<Images>>(jsonImages, notesType)
    }
}

Не забудьте добавить gson в ваш файл Gradle:

implementation 'com.google.code.gson:gson:2.8.4'

InВ вашей таблице " Directory " список изображений будет храниться непосредственно в столбце " images " в формате json.

2-й вариант, если вы просто хотите создать другую таблицу для ваших изображений и выполнить запросы к ним.

Вам нужно будет использовать отношения один ко многим и иметь 3 объекта:

// directory.kt
@Entity(tableName = "directory")
class Directory(@PrimaryKey(autoGenerate = false) var id: Int,
                @ColumnInfo(name = DIR_NAME) var dirName: String)


// image.kt
@Entity(tableName = "images")
class Image(@PrimaryKey(autoGenerate = false) var id: Int,
            @ColumnInfo(name ="images") var image: String,
            @ColumnInfo(name ="directoryId") var directoryId: Int)

// directoryWithImages.kt
public class DirectoryWithImages {
   @Embedded
   public Directory directory;

   @Relation(parentColumn = "id", entityColumn = "directoryId", entity = Image.class)
   public List<Image> images;
}

И, наконец, ваш дао:

@Dao
public interface LoadDirectoryWithImagesDao {
    @Query("SELECT * FROM directory")
    public List<DirectoryWithImages> loadDirectoriesWithImages();
}

Надеюсь, это поможет!

...