簡體   English   中英

如何設置外鍵

[英]How do I set up a Foreign Key

我設置的是兩個表,一個用於用戶創建的帳戶,另一個用於讓用戶購買產品。

我把兩張桌子都設置成這樣

客戶表

@PrimaryKey(autoGenerate = true)
    private int custId;

    @ColumnInfo(name = "user_name")
    private String userName;

    @ColumnInfo(name = "password")
    private String password;

    @ColumnInfo(name = "first_name")
    private String firstName;

    @ColumnInfo(name = "last_name")
    private String lastName;

    @ColumnInfo(name = "address")
    private String address;

    @ColumnInfo(name = "city")
    private String city;

    @ColumnInfo(name = "postal_code")
    private String postalCode;

    @ColumnInfo(name = "country")
    private String country;

電話表


    @PrimaryKey(autoGenerate = true)
    private int productId;
    private String phoneMake;
    private String phoneModel;
    private String phoneColor;
    private String storageCapacity;
    private Float  price;

我設置的是兩個外鍵,每個表一個。 我的最后一張表用於訂購電話,這需要使用每個表中的兩個主鍵。 我覺得我需要的是一個 ForeignKey,類似於已經創建的 PrimaryKey。 問題是我不確定如何將其實現到程序中。 我嘗試做的一切都不起作用。 我查看了文檔,但沒有任何點擊。 我希望你能幫助我提供正確的屏幕截圖。 如果需要更多,請告訴我(這段代碼是用 Java 代碼編寫的)

如果您只是希望客戶擁有 1 部電話,那么您只有一個列(成員變量)用於存儲電話產品 ID 的關系。

例如

private int mapToPhone; //<<<<< ADDED no need for @ColumnInfo the column name will be as per the variable name.

很明顯,您將值設置為適當的值。

然后讓客戶獲得電話的詳細信息,然后您有一個 POJO,它使用@Embedded批注嵌入父級(客戶),並使用@Relation批注嵌入子級(電話)。

例如:-

class CustomerWithPhoneDetails {
   @Embedded
   Customer customer;
   @Relation(
           entity = Phone.class,
           parentColumn = "mapToPhone",
           entityColumn = "productId"
   )
   Phone phoneDetails;
}

然后,您可以在 @Dao 注釋接口/抽象 class 中使用一個方法來查詢父表,但返回 POJO 或 POJO 的列表/數組,例如:-

@Query("SELECT * FROM Customer")
abstract List<CustomerWithPhoneDetails> getAllCustomersWithPhoneDeytails();

例子

根據您的代碼和附加示例代碼以及帶@Database注釋的摘要 class:-

@Database(entities = {Customer.class,Phone.class}, version = 1, exportSchema = false)
abstract class TheDatabase extends RoomDatabase {
    abstract AllDao getAllDao();

    private static volatile TheDatabase instance = null;

    public static TheDatabase getInstance(Context context) {
        if (instance == null) {
            instance = Room.databaseBuilder(context,TheDatabase.class,"the_database.db")
                    .allowMainThreadQueries()
                    .build();
        }
        return instance;
    }
}

和一個活動,例如:-

public class MainActivity extends AppCompatActivity {

    TheDatabase db;
    AllDao dao;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        db = TheDatabase.getInstance(this);
        dao = db.getAllDao();

        long phone01ProductId = dao.insert(new Phone("PhoneMaker001","Model001","Color001","100Mb",111.11F));
        long phone02ProductId = dao.insert(new Phone("PhoneMaker002","Model002","Color002","200Mb",222.22F));

        dao.insert(new Customer("c001","password001","firstname001","lastname001","address001","city001","country001","postcode001",(int) phone01ProductId));
        dao.insert(new Customer("c002","password002","firstname002","lastname002","address002","city002","country002","postcode002",(int) phone02ProductId));

        for(CustomerWithPhoneDetails cwpd: dao.getAllCustomersWithPhoneDeytails()) {
            Log.d("DBINFO","Customer is " + cwpd.customer.getUserName() + " etc.  Phone is " + cwpd.phoneDetails.getProductId() + " etc." );
        }
    }
}
  • 請注意,合適的構造函數已在 Phone 和 Customer class 中編碼(默認/空構造函數和一個,使用@Ignore注釋進行注釋,允許所有值禁止傳遞 id,如下例中所用)

  • 請注意,最好將 long 而不是 int 用於 id 列。

結果

日志:-

D/DBINFO: Customer is c001 etc.  Phone is 1 etc.
D/DBINFO: Customer is c002 etc.  Phone is 2 etc.

應用檢查:-

在此處輸入圖像描述

和:-

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM