以下のようなクラスエンティティがあります
@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など)を埋める方法はありますか?
私は数日前に同じ問題に直面し、このスレッドを見ました。データベースエンティティの作成にKotlin data
クラスを使用しています。 Kotlinデータクラスが継承サブクラスでうまく機能しないことを考えると、実行可能なオプションではありませんでした。私の解決策は、次のようにラッピングクラスで@Embedded
キーワードを使用することでした。
data class TaskToDisplay(@Embedded
var task: Task,
var noOfSubTask: Int = 0)
このソリューションでは、データベースに追加の列は作成されず、最も重要なのは、すべてのタスクのフィールドが部屋の応答列と一致することです。
タスクのサブクラスを作成するとします
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();
次のように、@ 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ディスカッション を参照してください
Kotlinを使用していますが、同様の問題がありました。解決方法を次に示します。
追加フィールドを追加し、?(クエスチョンマーク)を使用してnullを許可し、@ Ignoreアノテーションなし
@Entity(tableName = "task")
data class Task (
val name: String,
val parentId: Integer,
val userId: Integer,
val noOfSubTask: Integer?
)
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 を試すことができます。