android - 如何从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);
}
}
}
解决方案
Room 插入函数返回主键。它不会在对象上设置主键。当insert函数返回时,必须自己给对象赋值主键
@Override
protected Long doInBackground(CustomerDetails... customerDetails) {
Long pk = customerDetailsDAO.insertCustomerDetails(customerDetails[0]);
customerDetails[0].setCustomerId(pk);
return pk
}
对于您的示例,它可能看起来像这样。此外,您有一个 Int 作为 CustomerId,它应该是 Long,因为它是主键。
推荐阅读
- java - 从 Java 应用程序启动外部 jar 文件
- rest - 如何从 SoapUI 中的值中删除方括号?
- firebase - firebase firestore数据库中“资源”一词的含义是什么
- arrays - 如何使用 JSON 条件表达式解析此 JSON?
- sql-server - 多少字节用于在 nvarchar(n) 列中存储空值?
- sql - 无法计算出可以得到我想要的结果的 SQL 查询
- python - 如何自定义轴标签,如 6,7,8,9,10,11,12,1,2,3,4,5
- java - 在 Oracle ADF 中使用 EAR 文件设置应用程序
- multithreading - TThread::Queue 崩溃 C++ Builder
- go - 如何解析“2019-09-19 04:03:01.770080087 +0000 UTC”时间戳