简体   繁体   中英

Realm Update failed - Android

I'm using realm for my android apps, So I want to update my Bill object using the same Primary key, but ended with

FATAL EXCEPTION: main Process: com.example.rikirikmen.billsplit, PID: 22045 io.realm.exceptions.RealmPrimaryKeyConstraintException: Value already exists: 1

realm.executeTransaction(new Realm.Transaction() {
                    @Override
                    public void execute(Realm realm) {
                        Bill updateBill = realm.where(Bill.class).equalTo("Bill_ID", bill).findFirst();
                        DetailMenu menu = realm.createObject(DetailMenu.class);

                        menu.setMenuID(MenuID);
                        menu.setMenuName(String.valueOf(menuName.getText()));
                        menu.setMenuPrice(Price);
                        menu.setQuantity(Qty);
                        for (int i = 0; i < adapter.getPersonMenuObjList().size(); i++) {
                            PersonInMenu pim = realm.createObject(PersonInMenu.class);
                            pim.setPersonID(adapter.getPersonMenuObjList().get(i).getPersonID());
                            pim.setStatus(adapter.getPersonMenuObjList().get(i).isStatus());
                            menu.personInMenus.add(pim);
                        }

                        updateBill.detailmenu.add(menu);
                        realm.copyToRealmOrUpdate(updateBill);
                    }
                });

Do this :

           realm.executeTransaction(new Realm.Transaction() {
                @Override
                public void execute(Realm realm) {
                    Bill updateBill = realm.where(Bill.class).equalTo("Bill_ID", bill).findFirst();
                    DetailMenu menu = new DetailMenu();
                    RealmList<PersonInMenu> personInMenus = new RealmList<>(); //added line
                    menu.personInMenus = personInMenus; //added line
                    menu.setMenuID(MenuID);
                    menu.setMenuName(String.valueOf(menuName.getText()));
                    menu.setMenuPrice(Price);
                    menu.setQuantity(Qty);
                    for (int i = 0; i < adapter.getPersonMenuObjList().size(); i++) {
                        PersonInMenu pim = new PersonInMenu();
                        pim.setPersonID(adapter.getPersonMenuObjList().get(i).getPersonID());
                        pim.setStatus(adapter.getPersonMenuObjList().get(i).isStatus());
                        menu.personInMenus.add(pim);
                    }

                    updateBill.detailmenu.add(menu);
                    realm.copyToRealmOrUpdate(updateBill);
                }
            });

Although if you're hesitant about saving detached objects to the Realm through copyToRealmOrUpdate() , then use the appropriate override for createObject() which actually takes a primary key as its second parameter .

If you use createObject(clazz, primaryKey) then you won't need copyToRealmOrUpdate() in this case.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM