客户班
@RealmClass
public class Customer extends RealmObject {
@PrimaryKey private int id;
private int customerSerial;
@Required private String customerName;
private RealmList<Invoice> invoices = new RealmList<>();
public Customer() {}
public Customer(int id, int customerSerial, String customerName) {
this.id = id;
this.customerSerial = customerSerial;
this.customerName = customerName;
}
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public int getCustomerSerial() { return customerSerial; }
public void setCustomerSerial(int customerSerial) { this.customerSerial = customerSerial; }
public String getCustomerName() { return customerName; }
public void setCustomerName(String customerName) { this.customerName = customerName; }
public List<Invoice> getInvoices() { return invoices; }
public void setInvoices(RealmList<Invoice> invoices) { this.invoices = invoices; }
}
发票类
@RealmClass
public class Invoice extends RealmObject {
@PrimaryKey private int invoiceNumber;
private Date invoiceDate;
private String invoiceTime;
private int debtorSerNo;
private int deliveryStatus;
private long invoiceSort;
private int driverId;
private String debtorName;
private boolean codCustomer;
private boolean outstandingCOD;
private double outstandingCODAmount;
private String deliveryNotes;
private int lineCount;
public Invoice() {}
public Invoice(TtInvoice invoice) {
this.invoiceNumber = invoice.getInvoiceNumber();
this.invoiceDate = invoice.getInvoiceDate();
this.invoiceTime = invoice.getInvoiceTime();
this.debtorSerNo = invoice.getDebtorSerNo();
this.deliveryStatus = 0;
this.debtorName = invoice.getDebtorName();
this.codCustomer = invoice.isCodCustomer();
this.outstandingCOD = invoice.isOutstandingCOD();
this.outstandingCODAmount = invoice.getOutstandingCODAmount();
this.deliveryNotes = invoice.getDeliveryNotes();
this.lineCount = invoice.getLineCount();
}
public int getInvoiceNumber() {
return invoiceNumber;
}
public void setInvoiceNumber(int invoiceNumber) {
this.invoiceNumber = invoiceNumber;
}
public Date getInvoiceDate() {
return invoiceDate;
}
public LocalDateTime getInvoiceDateTime() {
LocalTime time = LocalTime.parse(invoiceTime);
LocalDate date = invoiceDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
return date.atTime(time);
}
public void setInvoiceDate(Date invoiceDate) {
this.invoiceDate = invoiceDate;
}
public String getInvoiceTime() {
return invoiceTime;
}
public void setInvoiceTime(String invoiceTime) {
this.invoiceTime = invoiceTime;
}
public int getDebtorSerNo() {
return debtorSerNo;
}
public void setDebtorSerNo(int debtorSerNo) {
this.debtorSerNo = debtorSerNo;
}
public String getDebtorName() {
return debtorName;
}
public void setDebtorName(String debtorName) {
this.debtorName = debtorName;
}
public boolean isCodCustomer() {
return codCustomer;
}
public void setCodCustomer(boolean codCustomer) {
this.codCustomer = codCustomer;
}
public boolean isOutstandingCOD() {
return outstandingCOD;
}
public void setOutstandingCOD(boolean outstandingCOD) {
this.outstandingCOD = outstandingCOD;
}
public double getOutstandingCODAmount() {
return outstandingCODAmount;
}
public void setOutstandingCODAmount(double outstandingCODAmount) {
this.outstandingCODAmount = outstandingCODAmount;
}
public String getDeliveryNotes() {
return deliveryNotes;
}
public void setDeliveryNotes(String deliveryNotes) {
this.deliveryNotes = deliveryNotes;
}
public int getLineCount() {
return lineCount;
}
public void setLineCount(int lineCount) {
this.lineCount = lineCount;
}
public int getDeliveryStatus() {
return deliveryStatus;
}
public void setDeliveryStatus(int deliveryStatus) {
this.deliveryStatus = deliveryStatus;
}
public long getInvoiceSort() {
return invoiceSort;
}
public void setInvoiceSort(long invoiceSort) {
this.invoiceSort = invoiceSort;
}
public int getDriverId() {
return driverId;
}
public void setDriverId(int driverId) {
this.driverId = driverId;
}
}
Tt发票类
TtInvoice 是在扫描发票上的条形码时从远程 JSON 对象创建的,添加了一个仅用于测试目的的构造函数。
public class TtInvoice implements Serializable {
@JsonProperty("Invoice_Number")
private int invoiceNumber;
@JsonProperty("Invoice_Date")
private Date invoiceDate;
@JsonProperty("Invoice_Time")
private String invoiceTime;
@JsonProperty("Debtor_Ser_No")
private int debtorSerNo;
@JsonProperty("Debtor_Name")
private String debtorName;
@JsonProperty("COD_Customer")
private boolean codCustomer;
@JsonProperty("Outstanding_COD")
private boolean outstandingCOD;
@JsonProperty("Outstanding_COD_Amount")
private double outstandingCODAmount;
@JsonProperty("Delivery_Notes")
private String deliveryNotes;
@JsonProperty("Line_Count")
private int lineCount;
public TtInvoice(int invoiceNumber, Date invoiceDate, String invoiceTime, int debtorSerNo, int deliveryStatus) {
this.invoiceNumber = invoiceNumber;
this.invoiceDate = invoiceDate;
this.invoiceTime = invoiceTime;
this.debtorSerNo = debtorSerNo;
this.deliveryStatus = deliveryStatus;
}
public int getInvoiceNumber() {
return invoiceNumber;
}
public void setInvoiceNumber(int invoiceNumber) {
this.invoiceNumber = invoiceNumber;
}
public Date getInvoiceDate() {
return invoiceDate;
}
public void setInvoiceDate(Date invoiceDate) {
this.invoiceDate = invoiceDate;
}
public String getInvoiceTime() {
return invoiceTime;
}
public void setInvoiceTime(String invoiceTime) {
this.invoiceTime = invoiceTime;
}
public LocalDateTime getInvoiceDateTime() {
LocalTime time = LocalTime.parse(invoiceTime);
LocalDate date = invoiceDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
return date.atTime(time);
}
public int getDebtorSerNo() {
return debtorSerNo;
}
public void setDebtorSerNo(int debtorSerNo) {
this.debtorSerNo = debtorSerNo;
}
public String getDebtorName() {
return debtorName;
}
public void setDebtorName(String debtorName) {
this.debtorName = debtorName;
}
public String getDeliveryNotes() {
return deliveryNotes;
}
public void setDeliveryNotes(String deliveryNotes) {
this.deliveryNotes = deliveryNotes;
}
public boolean isCodCustomer() {
return codCustomer;
}
public void setCodCustomer(boolean codCustomer) {
this.codCustomer = codCustomer;
}
public boolean isOutstandingCOD() {
return outstandingCOD;
}
public void setOutstandingCOD(boolean outstandingCOD) {
this.outstandingCOD = outstandingCOD;
}
public double getOutstandingCODAmount() {
return outstandingCODAmount;
}
public void setOutstandingCODAmount(double outstandingCODAmount) {
this.outstandingCODAmount = outstandingCODAmount;
}
public int getLineCount() {
return lineCount;
}
public void setLineCount(int lineCount) {
this.lineCount = lineCount;
}
}
在我的片段中,如果我这样做
private RealmChangeListener<RealmResults<Customer>> customerRealmChangeListener;
RealmResults<Customer> customerRealmResults;
Realm realm = Realm.getDefaultInstance();
customerRealmChangeListener = customers -> {
customers.forEach(customer -> {
Log.w("CUSTOMERS", customer.getCustomerName());
});
};
customerRealmResults = realm.where(Customer.class).equalTo("invoices.deliveryStatus", 0).findAllAsync();
customerRealmResults.addChangeListener(customerRealmChangeListener);
realm.executeTransactionAsync(transactionRealm -> {
Customer newCustomer = new Customer(1, 1, "Test Customer 1");
Invoice newInvoice1 = new Invoice(new TtInvoice(1234, 20/02/2023, "10:07:00", 1, 0));
Invoice newInvoice2 = new Invoice(new TtInvoice(2468, 20/02/2023, "10:08:00", 1, 1));
newCustomer.getInvoices().add(newInvoice1);
newCustomer.getInvoices().add(newInvoice2);
transactionRealm.insert(newCustomer);
});
添加没有问题,我遇到的问题是“findAllAsync”,它返回两张发票,而不仅仅是 1.
我按预期让客户回来了,但是调用“customer.getInvoices()”会返回 2 张发票,而不仅仅是 1 张。
我觉得我想做的事情非常简单,我只是没有看到问题,已经尝试了几天,现在无济于事。
如果我在 findAllAsync() 调用上设置断点并使用相同的查询运行我自己的“findAll()”,它会出现同样的问题。
也许这就是我添加新发票的方式,但不是 100% 确定。
否则我喜欢 Realm 比 Room 好多了。