web-dev-qa-db-ja.com

Androidルーム永続性ライブラリを使用して、オブジェクト内にオブジェクトを挿入します

ディレクトリ

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

}

ディレクトリに画像のリストを挿入する方法は?画像用に別のDaoを作成する必要がありますか?

7
renzvader

画像のリストを文字列の単純なリストにしてみませんか? (画像に固執したい場合は、kotlinでtypealiasを使用できます)

Imageオブジェクトにアクセスする方法に応じて、2つのオプションがあります。 Directoryオブジェクトから画像のリストのみを取得しても大丈夫ですか、それともDB内のimagesでいくつかのクエリを実行する必要がありますか? (count、findByなど...)

最初のオプション、ディレクトリオブジェクト内の画像のリストを取得したいだけの場合(おそらくあなたのケースに最適です):

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

Gradleファイルにgsonを追加することを忘れないでください:

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

テーブル "Directory"では、画像のリストがjson形式で列 "images"に直接保存されます。

2番目のオプション、画像用に別のテーブルを作成し、それらに対してクエリを実行する場合。

1対多のリレーションを使用し、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();
}

この助けを願っています!

5
GuillaumeAgis