簡體   English   中英

IllegalArgumentException 'value' 的每個元素都必須是有效的托管對象

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

下面給出的是一個片段(PurchaseFinalDetailsFragment),它從其他 2 個片段(PurchaseItemsFragment 和 PurchaseAddPayedEmployeeFragment)中獲取值。 我有 3 個模型類。 1. 整體購買, 2. 商品詳情, 3 . 付款的員工詳細信息。 2 和 3 也是模型類 1 中的成員。我收到了非法參數異常。 在下面發布代碼和日志。 任何幫助都非常感謝。 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++;
    }

   }

模型類是:

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 和 DBPurchase Employee 本身是擴展了領域對象的模型類。 我收到了非法ArgumentException。 貼出日志如下:

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)

根據例外情況,

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

將非托管 RealmList 設置為托管對象的字段是不可能的。

所以代替

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

應該是

DBPurchase dbPurchaseModel = new DBPurchase();

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

盡管我對static List<...> s(尤其是非托管 RealmLists)持謹慎態度,但它通常是錯誤設計選擇的一個指標。

@EpicPandaForce 的回答幫助了我。 我只是發布我的工作代碼片段。

當心:在此重新分配操作后,被替換的舊對象仍然保留在數據庫中。 您可能想要改變現有列表而不是重新分配它。

科特林:

// 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM