领域对象未完全持久化

时间:2015-11-24 19:28:14

标签: java android realm

我无法了解realm.io如何持久保存对象。

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

奇怪的是,库存对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();

我已经在这里看到了一些像这样的答案: stack answer 和Java示例(人,狗,猫)

随API提供

但我无法理解如何正确插入此内容。

1 个答案:

答案 0 :(得分:0)

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

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

此外,inventoryItems本身并不存储在Realm db中。循环后添加realm.copyToRealmOrUpdate(inventoryItems)