web-dev-qa-db-ja.com

部屋ライブラリのエンティティの非列フィールドを埋める方法

以下のようなクラスエンティティがあります

@Entity
public class Task {    
    private String name; 
    private Integer ParentId;
    private Integer userId;   
    @Ignore
    private int noOfSubTask;
}

dAOクラスにはメソッドgetTaskList()があります

@Dao
public interface TaskDao extends Dao<Task> {

@Query("SELECT *,(SELECT count(*) FROM Task b  WHERE a._id = b.ParentId ) AS noOfSubTask FROM Task a ")
LiveData<List<Task>> getTaskList();
}

NoOfSubTaskにクエリの(SELECT count(*)FROM Task b WHERE a._id = b.ParentId)の部分で指定された数を入力したいのですが、問題は列ではないため、ルームライブラリがgetTaskListメソッドをマップしませんdao実装(自動生成)クラス。

ルームライブラリのdaoクラスのメソッドを使用して、エンティティの非列フィールド(私の場合はnoOfSubTaskなど)を埋める方法はありますか?

17
Kevan

私は数日前に同じ問題に直面し、このスレッドを見ました。データベースエンティティの作成にKotlin dataクラスを使用しています。 Kotlinデータクラスが継承サブクラスでうまく機能しないことを考えると、実行可能なオプションではありませんでした。私の解決策は、次のようにラッピングクラスで@Embeddedキーワードを使用することでした。

data class TaskToDisplay(@Embedded
                         var task: Task,
                         var noOfSubTask: Int = 0)

このソリューションでは、データベースに追加の列は作成されず、最も重要なのは、すべてのタスクのフィールドが部屋の応答列と一致することです。

8
mtsahakis

タスクのサブクラスを作成するとします

public class TaskDisplayModel extends Task{

@Ignore
private transient int noOfSubTask;

}

次に、クエリは

@Query("SELECT *,(SELECT count(*) FROM Task b  WHERE a._id = b.ParentId ) AS noOfSubTask FROM Task a ")
LiveData<List<TaskDisplayModel >> getTaskList();
4
Akash

次のように、@ Ignoreフィールドをコンストラクタの外に移動する必要があります。

サンプルデータ:

@Entity(primaryKeys = ["id"])
data class User(
    @SerializedName("id")
    val id: Int,

    @SerializedName("name")
    val name: String,

    @SerializedName("age")
    val age: Int
) {
   @Ignore
   val testme: String?
}

詳細は githubディスカッション を参照してください

1
Nischal

Kotlinを使用していますが、同様の問題がありました。解決方法を次に示します。

  1. 追加フィールドを追加し、?(クエスチョンマーク)を使用してnullを許可し、@ Ignoreアノテーションなし

    @Entity(tableName = "task")
    data class Task (
        val name: String,
        val parentId: Integer,
        val userId: Integer,
        val noOfSubTask: Integer?
    )
    
  2. DAOでタスクを選択するすべてのクエリにフィールド(この場合はnoOfSubTask)を追加します。

    @Dao
    interface TaskDao {
        @Query("SELECT *,(SELECT count(*) FROM Task b  WHERE a._id = b.ParentId ) AS noOfSubTask FROM Task a ")
        fun getTaskList(): LiveData<List<Task>>
    
        @Query("SELECT *, NULL AS noOfSubTask FROM Task WHERE name = :name")
        fun getTask(name: String): LiveData<Task>
    
        ...
    }
    

これが機能しない場合は、Google I/O 2018で最近導入された RawQuery を試すことができます。

0
Joonsoo