Below given is a fragment(PurchaseFinalDetailsFragment) which takes values from 2 other fragment(PurchaseItemsFragment and PurchaseAddPayedEmployeeFragment). I have 3 model classes. 1. for the whole purchase, 2. for item details, 3 . for the employee details who made the payment. 2 and 3 are also a member in model class 1. I am getting illegalArgumentException. posting the codes and the logs below. Any help is greatly appreiated. 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. I am getting illegalArgumentException. 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.
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.