首页 > 解决方案 > 如何从java中的房间数据库中获取自动生成的ID?

问题描述

我有一个表,其中我有一个客户 id 列,该列是自动生成的之前通过堆栈溢出,但我没有找到任何解决方案。另外我想知道我在实体类中有用于 id 的 Setter 方法,但是当我获取值时它总是显示 0。

实体类

@Entity
public class CustomerDetails  {
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "Customer_Id")
    private int CustomerId;

    @NonNull
    @ColumnInfo(name = "Customer_FirstName")
    private  String CustomerFirstName;

    @NonNull
    @ColumnInfo(name = "Customer_LastName")
    private  String CustomerLastName;
    @NonNull
    @ColumnInfo(name = "Customer_PhoneNumber")
    private  String CustomerPhoneNo;
    @NonNull
    @ColumnInfo(name = "Customer_Address")
    private  String CustomerAddress;

    @ColumnInfo(name = "Created_At",defaultValue = "CURRENT_DATETIME")
    @TypeConverters(TimestampConverter.class)
    private Date createdAt;

    public CustomerDetails(@NonNull String customerFirstName, @NonNull String customerLastName, @NonNull String customerPhoneNo, @NonNull String customerAddress, Date createdAt) {
        CustomerFirstName = customerFirstName;
        CustomerLastName = customerLastName;
        CustomerPhoneNo = customerPhoneNo;
        CustomerAddress = customerAddress;
        this.createdAt = createdAt;
    }

    public CustomerDetails() {
    }

    public int getCustomerId() {
        return CustomerId;
    }

    public void setCustomerId(int customerId) {
       CustomerId = customerId;
    }

    @NonNull
    public String getCustomerFirstName() {
        return CustomerFirstName;
    }

    @NonNull
    public String getCustomerLastName() {
        return CustomerLastName;
    }



    @NonNull
    public String getCustomerAddress() {
        return CustomerAddress;
    }

    @NonNull
    public Date getCreatedAt() {
        return createdAt;
    }

    public void setCustomerFirstName(@NonNull String customerFirstName) {
        CustomerFirstName = customerFirstName;
    }

    public void setCustomerLastName(@NonNull String customerLastName) {
        CustomerLastName = customerLastName;
    }


    public void setCustomerAddress(@NonNull String customerAddress) {
        CustomerAddress = customerAddress;
    }

    public void setCreatedAt(@NonNull Date createdAt) {
        this.createdAt = createdAt;
    }

    @NonNull
    public String getCustomerPhoneNo() {
        return CustomerPhoneNo;
    }

    public void setCustomerPhoneNo(@NonNull String customerPhoneNo) {
        CustomerPhoneNo = customerPhoneNo;
    }
}

DAO接口

    @Dao
public interface CustomerDetailsDAO {
    @Insert
    long insertCustomerDetails(CustomerDetails customerDetails);

    @Query("SELECT * FROM CUSTOMERDETAILS ORDER BY Created_At")
    LiveData<List<CustomerDetails>> getCustomerDetails();



}

存储库类

    public class CustomerDetailsRepositary {
    private CustomerDetailsDAO customerDetailsDAO;
    private LiveData<List<CustomerDetails>> customerdetails;
    public CustomerDetailsRepositary(Application application){
        CustomerDatabase customerDatabase = CustomerDatabase.getCustomerDatabaseInstance(application);
        customerDetailsDAO = customerDatabase.customerDetailsDAO();
        customerdetails = customerDetailsDAO.getCustomerDetails();
    }
    public long insert(CustomerDetails customerDetails){

         new InsertCustomerDetailAsyncTask(customerDetailsDAO).execute(customerDetails);
        return customerDetails.getCustomerId();

    }


    public LiveData<List<CustomerDetails>> getCustomerdetails(){
        return customerdetails;
    }
    private static class  InsertCustomerDetailAsyncTask extends AsyncTask<CustomerDetails, Void, Long> {
        private CustomerDetailsDAO customerDetailsDAO;

        private InsertCustomerDetailAsyncTask(CustomerDetailsDAO customerDetailsDAO){
            this.customerDetailsDAO=customerDetailsDAO;
        }
        @Override
        protected Long doInBackground(CustomerDetails... customerDetails) {
            return customerDetailsDAO.insertCustomerDetails(customerDetails[0]);
        }

        @Override
        protected void onPostExecute(Long aLong) {
            super.onPostExecute(aLong);
        }
    }

}

标签: android

解决方案


Room 插入函数返回主键。它不会在对象上设置主键。当insert函数返回时,必须自己给对象赋值主键

   @Override
    protected Long doInBackground(CustomerDetails... customerDetails) {
        Long pk = customerDetailsDAO.insertCustomerDetails(customerDetails[0]);
        customerDetails[0].setCustomerId(pk);
        return pk
    }

对于您的示例,它可能看起来像这样。此外,您有一个 Int 作为 CustomerId,它应该是 Long,因为它是主键。


推荐阅读