web-dev-qa-db-ja.com

ルーム永続データベース-テーブルに関連する主キーがない場合、DBにアイテムのリストを挿入する方法

リストアイテムを部屋に入れるのに苦労しています。リスト項目は測定と呼ばれ、そのタイプは測定です。リスト項目には、データベースに関連するプライマリキーがありません。しかし、必要であればProductModelに同じ主キーを追加しても問題ありません。

ここに私がこれまで持っているものがあります:

@Entity(tableName = TABLE_NAME)
public class ProductModel {

    public static final String TABLE_NAME = "product";

    @PrimaryKey
    private int idProduct;

    private int idCategoryDefault;

    @Relation(parentColumn = "idProduct", entityColumn = "idProduct", entity = SortedAttribute.class)
    private List<SortedAttribute> sortedAttributes = null;
}

@Entity
public class SortedAttribute {

    @PrimaryKey
    private int idProduct;

    private String reference;

    @Embedded
    private List<Measurement> measurements = null; //****how do i get this into room ? its a LIST of measurements, not a measurement so calling Embedded i think wont work as it cant flatten it****/
}

public class Measurement {

    private String value;
    private String valueCm;

    public Measurement() {
    }
}
9
j2emanue

Embedded注釈は、リストではなく、POJOまたはEntityでのみ使用できます。したがって、この場合、Roomはリストを自動的にフラット化できません。
TypeConverter を使用して、List<MeasurementStringJSON形式)に、またはその逆に。 JSONパーサーライブラリを使用してサポートできます。たとえば、次のようにGsonを使用します。

public class ProductTypeConverters {
    @TypeConverter
    public static List<Measurement> stringToMeasurements(String json) {
        Gson gson = new Gson();
        Type type = new TypeToken<List<Measurement>>() {}.getType();
        List<Measurement> measurements = gson.fromJson(json, type);
        return measurements;
    }

    @TypeConverter
    public static String measurementsToString(List<Measurement> list) {
        Gson gson = new Gson();
        Type type = new TypeToken<List<Measurement>>() {}.getType();
        String json = gson.toJson(list, type);
        return json;
    }
}

@Entity
@TypeConverters(ProductTypeConverter.class)
public class SortedAttribute {

    @PrimaryKey
    private int idProduct;

    private String reference;

    private List<Measurement> measurements = null; 
}
29
Quang Nguyen

@Relationはあなたが探しているものです。

https://developer.Android.com/reference/Android/Arch/persistence/room/Relation.html

ルームドキュメントから:

@Entity
public class Pet {
     @ PrimaryKey
     int petId;
     String name;
 }
 public class UserNameAndAllPets {
   public int userId;
   public String name;
   @Relation(parentColumn = "petId", entityColumn = "userId")
   public List<Pet> pets;
 }

 @Dao
 public interface UserPetDao {
     @Query("SELECT petId, name from User")
     public List<UserNameAndAllPets> loadUserAndPets();
 }

注:さらなる調査の結果、RoomはINSIDEオブジェクトであるオブジェクトのリストをまったくサポートしていません。私(およびその他)は、リストを個別に処理することを選択しました。ルームは、オブジェクト内にない限り、オブジェクトのリストをうまく処理できます。リスト内のアイテムがオブジェクト全体に関連している限り、リストを復元できます。

したがって、実際にはリストを@Ignoreし、Dao抽象クラスで処理するだけです。以前に見つけたSO投稿はこれを描写しています。

編集:型コンバーターを使用する

0
DeaMon1