Android房间关系一对多对多
Android Room Relation One-to-Many-to-Many
我正在使用 Room Library 开发 Android 应用程序。
该应用有 3 个实体,如任务、项目和子项目。
一个任务有一个或多个项目,一个项目有一个或多个子项目。
我需要查询任务及其子项。目前我查询任务,然后查询项目,然后查询子项目,但我想让它更有效率。
我已经读过这个https://developer.android.com/reference/android/arch/persistence/room/Relation,但我不知道如何编码这个关系。
Android Room 是 SQLite 的一个非常整洁的包装。我相信你已经知道了。
我在这里假设您熟悉 SQL 和 join 语句。
如果没有阅读 here。
我这么说的原因是你实际上可以在 DAO 中写任何你想写的东西,然后到处做很多 SQL 查询。
在您的情况下,您需要为任务、项目和子项目定义@Enitity。
然后你需要定义它们之间的关系,即Item中Task的外键是什么,SubItem中Item的外键是什么
示例:
我凭记忆写的,没有编译,所以可能有一些错误,但应该可以。
import android.arch.persistence.room.Entity;
import android.arch.persistence.room.ForeignKey;
import android.arch.persistence.room.PrimaryKey;
import static android.arch.persistence.room.ForeignKey.CASCADE;
@Entity(foreignKeys = @ForeignKey(entity = Task.class,
parentColumns = "id",
childColumns = "taskId",
onDelete = CASCADE))
public class Item {
@PrimaryKey public final int id;
public final int taskId;
public Item(final int id, final int userId) {
this.id = id;
this.userId = userId;
}
}
您可以对子项执行相同的操作。
现在是 DAO。
public interface DAO {
@Query("SELECT * from " +
"(LEFT JOIN item ON task.id = item.taskId) " +
"LEFT JOIN sub_item ON item.id = sub_item.itemId " +
"WHERE task.id=:id")
List getTask(int id);
}
我正在使用 Room Library 开发 Android 应用程序。
该应用有 3 个实体,如任务、项目和子项目。
一个任务有一个或多个项目,一个项目有一个或多个子项目。
我需要查询任务及其子项。目前我查询任务,然后查询项目,然后查询子项目,但我想让它更有效率。
我已经读过这个https://developer.android.com/reference/android/arch/persistence/room/Relation,但我不知道如何编码这个关系。
Android Room 是 SQLite 的一个非常整洁的包装。我相信你已经知道了。 我在这里假设您熟悉 SQL 和 join 语句。 如果没有阅读 here。 我这么说的原因是你实际上可以在 DAO 中写任何你想写的东西,然后到处做很多 SQL 查询。
在您的情况下,您需要为任务、项目和子项目定义@Enitity。 然后你需要定义它们之间的关系,即Item中Task的外键是什么,SubItem中Item的外键是什么
示例: 我凭记忆写的,没有编译,所以可能有一些错误,但应该可以。
import android.arch.persistence.room.Entity;
import android.arch.persistence.room.ForeignKey;
import android.arch.persistence.room.PrimaryKey;
import static android.arch.persistence.room.ForeignKey.CASCADE;
@Entity(foreignKeys = @ForeignKey(entity = Task.class,
parentColumns = "id",
childColumns = "taskId",
onDelete = CASCADE))
public class Item {
@PrimaryKey public final int id;
public final int taskId;
public Item(final int id, final int userId) {
this.id = id;
this.userId = userId;
}
}
您可以对子项执行相同的操作。 现在是 DAO。
public interface DAO {
@Query("SELECT * from " +
"(LEFT JOIN item ON task.id = item.taskId) " +
"LEFT JOIN sub_item ON item.id = sub_item.itemId " +
"WHERE task.id=:id")
List getTask(int id);
}