简体   繁体   English

IllegalArgumentException 'value' 的每个元素都必须是有效的托管对象

[英]IllegalArgumentException Each element of 'value' must be a valid managed object

Below given is a fragment(PurchaseFinalDetailsFragment) which takes values from 2 other fragment(PurchaseItemsFragment and PurchaseAddPayedEmployeeFragment).下面给出的是一个片段(PurchaseFinalDetailsFragment),它从其他 2 个片段(PurchaseItemsFragment 和 PurchaseAddPayedEmployeeFragment)中获取值。 I have 3 model classes.我有 3 个模型类。 1. for the whole purchase, 2. for item details, 3 . 1. 整体购买, 2. 商品详情, 3 . for the employee details who made the payment.付款的员工详细信息。 2 and 3 are also a member in model class 1. I am getting illegalArgumentException. 2 和 3 也是模型类 1 中的成员。我收到了非法参数异常。 posting the codes and the logs below.在下面发布代码和日志。 Any help is greatly appreiated.任何帮助都非常感谢。 TIA TIA

import io.realm.Realm;
import io.realm.RealmList;
import io.realm.RealmResults;
public class PurchaseFinalDetailsFragment extends BaseFragment implements PurchaseAddPayedEmployeeFragment.OnFragmentInteraction {
private static final String ARG_PURCHASE = "purchase";
    private static RealmList<DBPurchase> purchaseRealmList = new RealmList<>();
    private static RealmList<DBPurchaseQtyItem> purchaseQtyItemRealmList = new RealmList<>();
    private static RealmList<DBPurchaseEmployee> purchaseEmployeeRealmList = new RealmList<>();
    private static int id = 1;
    DBPurchase mDBPurchase = new DBPurchase();
    DBPurchaseQtyItem mDBPurchaseQtyItem = new DBPurchaseQtyItem();
    DBPurchaseEmployee mDBPurchaseEmployee = new DBPurchaseEmployee();
    DBPurchaseItem mDBPurchaseItem = new DBPurchaseItem();
    DBEmployee mDBEmployee = new DBEmployee();

    private Realm mRealm;
    private Purchase mPurchase;
    private ArrayList<PayedEmployee> mPayedEmployees = new ArrayList<>();

    public PurchaseFinalDetailsFragment() {
        // Required empty public constructor
    }

    public static PurchaseFinalDetailsFragment newInstance(Purchase purchase) {
        PurchaseFinalDetailsFragment fragment = new PurchaseFinalDetailsFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PURCHASE, NavigationUtils.getStringForObject(purchase));
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Bundle bundle = getArguments();
        if (bundle != null) {
            mPurchase = NavigationUtils.getObjectFromString(bundle.getString(ARG_PURCHASE), Purchase.class);
        }
        mRealm =Realm.getDefaultInstance();
    }


    @Override
    public void onDestroy() {
        super.onDestroy();
        if(mRealm != null) { mRealm.close(); }
    }

    public void initView(View rootView) {

        mEmployeeAdpater = new EmployeeAdpater(getContext(), mPayedEmployees,PurchaseFinalDetailsFragment.this);

        submitButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getFinalDetails();
            }
        });
    }

    public void getFinalDetails() {
            mDBPurchase.setAmountPayed(Double.parseDouble(amountPaidEditText.getText().toString()));
            mDBPurchase.setTotalAmount(Double.parseDouble(totalAmountEditText.getText().toString()));
            mDBPurchase.setCredit(Double.parseDouble(creditEditText.getText().toString()));
            for (int i = 0; i < mPayedEmployees.size(); i++) {
                mDBEmployee.setName(mPayedEmployees.get(i).getName());
                mDBPurchaseEmployee.setEmployee(mDBEmployee);
                mDBPurchaseEmployee.setAmount(mPayedEmployees.get(i).getAmountPaid());
            }
            purchaseEmployeeRealmList.add(mDBPurchaseEmployee);
            mDBPurchase.setPayedEmployees(purchaseEmployeeRealmList);
            for (int i = 0; i < mPurchase.getPurchaseItems().size(); i++) {
                mDBPurchaseItem.setName(mPurchase.getPurchaseItems().get(i).getName());
                mDBPurchaseQtyItem.setItem(mDBPurchaseItem);
                mDBPurchaseQtyItem.setQuantity(mPurchase.getPurchaseItems().get(i).getQuantity());
                mDBPurchaseQtyItem.setAmount(mPurchase.getPurchaseItems().get(i).getAmount());
            }
            purchaseQtyItemRealmList.add(mDBPurchaseQtyItem);
            mDBPurchase.setItems(purchaseQtyItemRealmList);
            mDBPurchase.setCreatedAt(parseDate(createdDate));
            mDBPurchase.setLastUpdatedAt(parseDate(Integer.toString(calender.get(Calendar.DATE))));
            addDataToRealm(mDBPurchase);

        } 
    }
    private void addDataToRealm(DBPurchase model) {
        mRealm.beginTransaction();
        DBPurchase dbPurchaseModel = mRealm.createObject(DBPurchase.class);
        dbPurchaseModel.setId(id);
        dbPurchaseModel.setAmountPayed(model.getAmountPayed());
        dbPurchaseModel.setCredit(model.getCredit());
        dbPurchaseModel.setTotalAmount(model.getTotalAmount());
        dbPurchaseModel.setItems(purchaseQtyItemRealmList);
        dbPurchaseModel.setPayedEmployees(purchaseEmployeeRealmList);
        dbPurchaseModel.setCreatedAt(model.getCreatedAt());
        dbPurchaseModel.setLastUpdatedAt(model.getLastUpdatedAt());
        purchaseRealmList.add(dbPurchaseModel);
        mRealm.commitTransaction();
        //purchaseFinalDetailsAdapter.notifyDataSetChanged();
        id++;
    }

   }

model class is:模型类是:

public class DBPurchase extends RealmObject {

    private int id;

    private RealmList<DBPurchaseQtyItem> items;

    private double totalAmount;

    private double amountPayed;

    private double credit;

    @Nullable
    private RealmList<DBPurchaseEmployee> payedEmployees;

    private Date createdAt = new Date();

    private Date lastUpdatedAt;

    public int getId() {
        return id;
    }

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

    public RealmList<DBPurchaseQtyItem> getItems() {
        return items;
    }

    public void setItems(RealmList<DBPurchaseQtyItem> items) {
        this.items = items;
    }

    public double getTotalAmount() {
        return totalAmount;
    }

    public void setTotalAmount(double totalAmount) {
        this.totalAmount = totalAmount;
    }

    public double getAmountPayed() {
        return amountPayed;
    }

    public void setAmountPayed(double amountPayed) {
        this.amountPayed = amountPayed;
    }

    public double getCredit() {
        return credit;
    }

    public void setCredit(double credit) {
        this.credit = credit;
    }

    public RealmList<DBPurchaseEmployee> getPayedEmployees() {
        return payedEmployees;
    }

    public void setPayedEmployees(RealmList<DBPurchaseEmployee> payedEmployees) {
        this.payedEmployees = payedEmployees;
    }

    public Date getCreatedAt() {
        return createdAt;
    }

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

    public Date getLastUpdatedAt() {
        return lastUpdatedAt;
    }

    public void setLastUpdatedAt(Date lastUpdatedAt) {
        this.lastUpdatedAt = lastUpdatedAt;
    }
}

DBPurchaseQtyItem and DBPurchase Employee itself are model classes which extends realmObject. DBPurchaseQtyItem 和 DBPurchase Employee 本身是扩展了领域对象的模型类。 I am getting illegalArgumentException.我收到了非法ArgumentException。 Posting the log below:贴出日志如下:

java.lang.IllegalArgumentException: Each element of 'value' must be a valid managed object.
                                                                             at io.realm.DBPurchaseRealmProxy.realmSet$items(DBPurchaseRealmProxy.java:184)
                                                                             at app.model.db.DBPurchase.setItems(DBPurchase.java:47)
                                                                             at app.ui.PurchaseFinalDetailsFragment.addDataToRealm(PurchaseFinalDetailsFragment.java:263)
                                                                             at app.ui.PurchaseFinalDetailsFragment.getFinalDetails(PurchaseFinalDetailsFragment.java:205)
                                                                             at app.ui.PurchaseFinalDetailsFragment$4.onClick(PurchaseFinalDetailsFragment.java:168)
                                                                             at android.view.View.performClick(View.java:5610)
                                                                             at android.view.View$PerformClick.run(View.java:22265)
                                                                             at android.os.Handler.handleCallback(Handler.java:751)
                                                                             at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                             at android.os.Looper.loop(Looper.java:154)
                                                                             at android.app.ActivityThread.main(ActivityThread.java:6077)
                                                                             at java.lang.reflect.Method.invoke(Native Method)
                                                                             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
                                                                             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

According to the exception,根据例外情况,

dbPurchaseModel.setItems(purchaseQtyItemRealmList); // <-- this line

setting the unmanaged RealmList as the field of a managed object is not possible.将非托管 RealmList 设置为托管对象的字段是不可能的。

So instead of所以代替

DBPurchase dbPurchaseModel = mRealm.createObject(DBPurchase.class);

it should be应该是

DBPurchase dbPurchaseModel = new DBPurchase();

and

mRealm.insertOrUpdate(dbPurchaseModel); // copyToRealmOrUpdate() before 1.1.1
mRealm.commitTransaction();

Although I'd be wary of the static List<...> s (and especially unmanaged RealmLists), it's generally an indicator of wrong design choice.尽管我对static List<...> s(尤其是非托管 RealmLists)持谨慎态度,但它通常是错误设计选择的一个指标。

@EpicPandaForce's answer helped me. @EpicPandaForce 的回答帮助了我。 I am just posting my working code snippet.我只是发布我的工作代码片段。

beware: the old objects that were replaced still stick around in the database after this re-assigning operation.当心:在此重新分配操作后,被替换的旧对象仍然保留在数据库中。 you may want to mutate the existing list instead of re-assigning it.您可能想要改变现有列表而不是重新分配它。

kotlin:科特林:

// replacing a list
val newList = listContents.map { RealmString(it) }
db.db.executeTransaction { database ->
    queriedList.realmList = RealmList(*database.copyToRealm(newList).toTypedArray())
}

// replacing a list element
val newElement = RealmString("wow")
db.db.executeTransaction { database ->
    queriedList.realmList[0] = database.copyToRealm(newElement)
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 java.lang.IllegalArgumentException:“值”不是有效的领域托管对象 - java.lang.IllegalArgumentException: 'value' is not a valid managed object with realm IllegalArgumentException:必须管理实体才能调用remove - IllegalArgumentException: Entity must be managed to call remove Spring 启动问题 - java.lang.IllegalArgumentException:值必须仅包含有效字符 - Spring startup issue - java.lang.IllegalArgumentException: Value must only contain valid chars Spring Webflow绑定:Converter - java.lang.IllegalArgumentException:每个转换器对象必须实现一个Converter ...接口 - Spring Webflow binding: Converter - java.lang.IllegalArgumentException: Each converter object must implement one of the Converter … interfaces 如何解决 IllegalArgumentException:目标对象不能为空 - How to resolve IllegalArgumentException: Target object must not be null java.lang.IllegalArgumentException:必须提供有效的 URL - java.lang.IllegalArgumentException: Must supply a valid URL xml:元素的值无效 - xml:The value of the element is not valid IllegalArgumentException返回对象清除中给定的值 - IllegalArgumentException return the value given in object decleration IllegalArgumentException:边界必须为正 - IllegalArgumentException: Bound must be positive IllegalArgumentException:实体不能是 null - IllegalArgumentException: Entity must not be null
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM