如何解决如何搜索共享外键的两个表我想我问的是对的......?
狗实体
@Entity(tableName = "dog_table")
public class DogEntity {
private int mId;
private String mName,mBreed;
etc..
}
玩具实体
@Entity(tableName = "toy_table")
public class ToyEntity {
private int mId;
private String mName,mBrand;
etc..
}
DogAndToy 连接表实体
@Entity(tableName = "dog_and_toy_join_table",primaryKeys = {"mDogID","mToyId"},foreignKeys = {
@ForeignKey(
entity = DogEntity.class,parentColumns = "mId",childColumns = "mDogID",onDelete = ForeignKey.CASCADE,onUpdate = ForeignKey.CASCADE
),@ForeignKey(
entity = ToyEntity.class,childColumns = "mToyId",onUpdate = ForeignKey.CASCADE
)
},indices = {@Index("mDogID"),@Index("mToyId")}
)
public class DogAndToyJoinEntity{
private final int mDogID,mToyId;
public DogAndToyJoinEntity(int mDogID,int mToyId) {
this.mDogID = mDogID;
this.mToyId = mToyId;
}
etc..
}
DogAndToy 数据类
public class DogAndToy {
@Embedded
public Dog mDog;
@Relation(
parentColumn = "mId",entityColumn = "mId",entity = ToyEntity.class,associateBy =
@Junction(
value = DogAndToyJoinEntity.class,parentColumn = "mDogId",entityColumn = "mToyId"
)
)
public List<ToyEntity> toyList;
}
注意:所有的狗都可以有多个玩具,玩具可以与多个狗相关联。 Dog & Toy 实体不共享任何字段(例如 - Dog 没有 toyId 等)
我已经尝试了几天来解决问题
我使用 DogAndToy 数据类在我的 RecyclerView 中进行显示。
JOIN 和 INNER JOIN 查询令我感到困惑,我一直在尝试多种变体,但始终以零搜索结果告终。这是我最近的尝试:
@Transaction
@Query("SELECT dog_table.* FROM dog_table" +
"INNER JOIN dog_and_toy_join_table ON dog_table.mId = dog_and_toy_join_table.mDogId" +
"INNER JOIN toy_table ON toy_table.mId = dog_and_toy_join_table.mToyId " +
"WHERE toy_table.mName LIKE :query")
LiveData<List<DogAndToy>> findDogsByToyName(String query);
谁能建议对 Android Room 中这些查询的分步说明?我在这里或互联网上的任何地方找到的任何 JOIN 文章/示例都没有“加入”(外键)参考... 我是否以正确的方式尝试这个?
更新:澄清一下,我有 FTS 表,我的“基本”搜索工作正常(例如 - 按名称搜索等)
解决方法
用变量替换 :toyName
SELECT d.mName FROM dog_table AS d
WHERE d.mId IN (
SELECT j.mDogID FROM dog_and_toy_join_table AS j
WHERE j.mToyId = (
SELECT t.mId FROM toy_table AS t
WHERE t.mName = :toyName));
编辑
TBH,不知道为什么它只选择一行。也许其他人可以回答。
这是平均时间:
select d.mName
from dog_table d
INNER join dog_and_toy_join_table dt
on d.mid = dt.mDogID
INNER JOIN toy_table t
ON dt.mToyId = t.mId
WHERE t.mName = 'toy1'
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。