我在我的 Android 應用程式 (Java) 中使用 Room 并且我有兩個具有 1:many 關系的物體。
鏡片物體 一個鏡片可以多次佩戴。
@Entity(tableName = "lens_table")
public class Lens {
@PrimaryKey(autoGenerate = true)
private int lensId;
private String name;
}
佩戴物體 一次佩戴只能與一個鏡片相關。
@Entity(tableName = "wear_table",
foreignKeys = {@ForeignKey(
entity = Lens.class,
parentColumns = "lensId",
childColumns = "fk_lensId",
onDelete = ForeignKey.CASCADE)},
indices = {@Index("fk_lensId")})
public class Wear {
@PrimaryKey(autoGenerate = true)
private int wearId;
private String name;
private int fk_lensId;
}
到現在為止還挺好。到目前為止,我對“標準”查詢(創建、獲取全部、更新、洗掉等)感到滿意,其中有很多檔案。我還成功實施了查詢,以根據以下關系獲取所有鏡片的佩戴情況。
public class LensWithWears {
@Embedded
public Lens lens;
@Relation(
parentColumn = "lensId",
entityColumn = "fk_lensId"
)
public List<Wear> wears;
}
但現在我需要查詢以下資訊:
通過查找wearId 獲取關聯鏡片的單次佩戴
我目前使用的關系類如下所示:
public class WearWithLens {
@Embedded
public Wear wear;
@Relation(
parentColumn = "wearId",
entityColumn = "lensId"
)
public Lens lens;
}
Dao Query 看起來像這樣:
@Query("SELECT * FROM wear_table WHERE wearId = :wearId LIMIT 1")
LiveData<WearWithLens> getWearWithLensByWearId(int wearId);
我的代碼顯然不起作用,否則我不會問......問題是,回傳了一個物件WearWithLens,但其中的鏡頭物件始終為空。
換句話說,我想查詢一個 Wear,它與一個鏡頭有 1:1 的關系,并將兩個物件放在 WearWithLens 類中。
有人可以告訴我查詢應該是什么樣子嗎?
謝謝!
uj5u.com熱心網友回復:
父列必須是形成兩者關系的列。也就是說它應該是fk_lensId列。
所以 :-
public class WearWithLens {
@Embedded
public Wear wear;
@Relation(
parentColumn = "fk_lensId",
entityColumn = "lensId"
)
public Lens lens;
}
舉個例子
- 不是使用
LiveData<WearWithLens> getWearWithLensByWearId(int wearId);而是WearWithLens getWearWithLensByWearId(int wearId);為了方便和簡潔。 - 使用添加了 getter 和 setter 的類/物體以及額外的建構式來減少編碼
- 顯然是上面的@Relationship。
具有以下內容:-
db = TheDatabase.getInstance(this);
dao = db.getAllDao();
int l1id = (int) dao.insert(new Lens("Lens1"));
int l2id = (int) dao.insert(new Lens("Lens2"));
int l3id = (int) dao.insert(new Lens("Lens3"));
dao.insert(new Wear("Wear1 child of Lens1",l1id));
dao.insert(new Wear("Wear2 child of Lens1",l1id));
dao.insert(new Wear("Wear3 child of Lens1",l1id));
dao.insert(new Wear("Wear4 child of Lens2",l2id));
dao.insert(new Wear("Wear5 child of Lens2",l2id));
dao.insert(new Wear("Wear6 child of Lens2",l2id));
dao.insert(new Wear("Wear7 child of Lens3",l3id));
for (Wear wear: dao.getAllWears()) {
WearWithLens currentWearWithLens = dao.getWearWithLensByWearId(wear.getWearId());
Log.d("DBINFO","Current Wear is " currentWearWithLens.wear.getName() " parent Lens is " currentWearWithLens.lens.getName());
}
結果是:-
2021-12-09 06:34:58.105 D/DBINFO: Current Wear is Wear1 child of Lens1 parent Lens is Lens1
2021-12-09 06:34:58.110 D/DBINFO: Current Wear is Wear2 child of Lens1 parent Lens is Lens1
2021-12-09 06:34:58.112 D/DBINFO: Current Wear is Wear3 child of Lens1 parent Lens is Lens1
2021-12-09 06:34:58.114 D/DBINFO: Current Wear is Wear4 child of Lens2 parent Lens is Lens2
2021-12-09 06:34:58.115 D/DBINFO: Current Wear is Wear5 child of Lens2 parent Lens is Lens2
2021-12-09 06:34:58.116 D/DBINFO: Current Wear is Wear6 child of Lens2 parent Lens is Lens2
2021-12-09 06:34:58.120 D/DBINFO: Current Wear is Wear7 child of Lens3 parent Lens is Lens3
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/377835.html
標籤:爪哇 安卓 sqlite 外键 android-room
上一篇:AndroidStudio顯示來自sqlite本地資料庫的資料
下一篇:默認情況下主鍵自動遞增嗎?
