领域对象未完全持久化

Realm object not fully persisted

我无法理解 realm.io persist/save 对象的方式。

我有 3 个对象(Inventory、InventoryItem 和 Product); 当我创建一个包含 InventoryItems 的 Inventory 时,它可以正常工作,直到我关闭应用程序。当我重新打开应用程序时,所有 InventoryItems 都会丢失对 Product 的引用并开始显示 "null"。

奇怪的是所有其他属性,如 Inventory 对 InventoryItem 的引用都保持良好。只是产品有问题。

这就是我想要做的事情:

型号 产品

public class Product extends RealmObject {
@PrimaryKey
private String id;
@Required
private String description;

private int qtdUnityType1;
private int qtdUnityType2;
private int qtdUnityType3;

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

public int getQtdUnityType1() {
    return qtdUnityType1;
}

public void setQtdUnityType1(int qtdUnityType1) {
    this.qtdUnityType1 = qtdUnityType1;
}

public int getQtdUnityType2() {
    return qtdUnityType2;
}

public void setQtdUnityType2(int qtdUnityType2) {
    this.qtdUnityType2 = qtdUnityType2;
}

public int getQtdUnityType3() {
    return qtdUnityType3;
}

public void setQtdUnityType3(int qtdUnityType3) {
    this.qtdUnityType3 = qtdUnityType3;
}

}

库存

public class Inventory extends RealmObject {

@PrimaryKey
private String id;

@Required
private String type;

@Required
private Date createdAt;

@Required
private String status;

public String getStatus() {
    return status;
}

public void setStatus(String status) {
    this.status = status;
}

private RealmList<InventoryItem> listItems;


public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getType() {
    return type;
}

public void setType(String type) {
    this.type = type;
}

public Date getCreatedAt() {
    return createdAt;
}

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

public RealmList<InventoryItem> getListItems() {
    return listItems;
}

public void setListItems(RealmList<InventoryItem> listItems) {
    this.listItems = listItems;
}

} InventoryItem

public class InventoryItem extends RealmObject {

@PrimaryKey
private String idItem;

private Inventory inventory;

 private Product product;

public Product getProduct() {
    return product;
}

public void setProduct(Product product) {
    this.product = product;
}


private Date expirationDate;

private int qtdUnityType1;

private int qtdUnityType2;

private int qtdUnityType3;

private int qtdDiscard;

public String getIdItem() {
    return idItem;
}

public void setIdItem(String idItem) {
    this.idItem = idItem;
}

public Inventory getInventory() {
    return inventory;
}

public void setInventory(Inventory inventory) {
    this.inventory = inventory;
}


public Date getExpirationDate() {
    return expirationDate;
}

public void setExpirationDate(Date expirationDate) {
    this.expirationDate = expirationDate;
}

public int getQtdUnityType1() {
    return qtdUnityType1;
}

public void setQtdUnityType1(int qtdUnityType1) {
    this.qtdUnityType1 = qtdUnityType1;
}

public int getQtdUnityType2() {
    return qtdUnityType2;
}

public void setQtdUnityType2(int qtdUnityType2) {
    this.qtdUnityType2 = qtdUnityType2;
}

public int getQtdUnityType3() {
    return qtdUnityType3;
}

public void setQtdUnityType3(int qtdUnityType3) {
    this.qtdUnityType3 = qtdUnityType3;
}

public int getQtdDiscard() {
    return qtdDiscard;
}

public void setQtdDiscard(int qtdDiscard) {
    this.qtdDiscard = qtdDiscard;
}

}

最后是我尝试坚持的数百万种方式之一

  realm.beginTransaction();

 Inventory inventory = realm.createObject(Inventory.class);
 inventory.setId(id);
 inventory.setCreatedAt(new DateTime().toDate());
 if (radioGroup.getCheckedRadioButtonId() == R.id.rbInventario) {
     inventory.setType("Inventário");
 } else {
     inventory.setType("Validade");
 }
 inventory.setStatus("Aberto");

 RealmList<InventoryItem> inventoryItems = new RealmList<>();
 RealmResults<Product> productsRealmResults = realm.allObjects(Product.class);


 for (int i = 1; i <= productsRealmResults.size(); i++) {
     InventoryItem item = realm.createObject(InventoryItem.class);
     item.setIdProduct(productsRealmResults.get(i - 1).getId() + " - " + productsRealmResults.get(i - 1).getDescription());
     item.setProduct(productsRealmResults.get(i - 1));
     item.setIdItem(i + "-" + id);
     item.setInventory(inventory);        
     item = realm.copyToRealmOrUpdate(item);
     item = realm.copyToRealmOrUpdate(item);
     inventoryItems.add(item);
 }
 inventory.setListItems(inventoryItems);


 realm.copyToRealmOrUpdate(inventory);
 realm.commitTransaction();

我已经在这里看了一些答案,例如: 和 Java-示例(人、狗、猫)

提供 API

但我不明白如何正确插入它。

问题是您正在设置未添加到 Realm 数据库的 InventoryItem 元素列表。

InventoryItem item = new InventoryItem();更改为InventoryItem item = realm.createObject(InventoryItem.class);

此外,inventoryItems 本身并未存储在 Realm 数据库中。在循环后添加realm.copyToRealmOrUpdate(inventoryItems)