2016-06-08 14 views
0

Ich verwende Bereich für meinen Android Apps, also ich mag meinen Bill Objekt aktualisieren, um die gleichen Primärschlüssel, aber am Ende mitRealm Update fehlgeschlagen - Android

FATAL AUSNAHME: Haupt Prozess: com. example.rikirikmen.billsplit, PID: 22045 io.realm.exceptions.RealmPrimaryKeyConstraintException: Wert bereits existiert: 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); 
        } 
       }); 
+0

was meinst du? Ich muss ein Objekt erstellen? das Objekt, das bereits in einer anderen Aktivität erstellt wurde .. Ich möchte nur das Objekt aktualisieren. –

+0

was meinst du in der Transaktion? Realm hat eine neue Methode realm.executetransaction für ersetzt realem.begintransaction und commit –

Antwort

0

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); 
       } 
      }); 

Obwohl, wenn Sie frei stehende Objekte im Reich durch copyToRealmOrUpdate() zögerlich sind über das Speichern, dann die appropriate override for createObject() which actually takes a primary key as its second parameter verwenden. Wenn Sie createObject(clazz, primaryKey) verwenden, benötigen Sie in diesem Fall keine copyToRealmOrUpdate().

+0

danke für Ihren Rat, eigentlich weiß ich nicht, es funktioniert oder nicht .. Ich habe gerade neue Fehler 'Process: com.example.rikirikmen.billsplit , PID: 31338 java.lang.NullPointerException: Es wurde versucht, die virtuelle Methode 'boolean io.realm.RealmList.add (io.realm.RealmModel)' für eine Nullobjektverweisliste unter com.example.rikirikmen.billsplit.DialogActivity $ 1 $ 1 aufzurufen. execute (DialogActivity.java:101) ' –

+0

mein Objekt ist gefüllt, ich weiß nicht, wo es falsch ist. hier wird das Protokoll '06-11 18: 02: 56,785 31.338-31.338/com.example.rikirikmen.billsplit I/Objekt: 6 wahr 06-11 18: 02: 56,785 31.338-31.338/com.example. rikirikmen.billsplit I/Objekt: 7 true 06-11 18: 02: 56.785 31338-31338/com.beispiel.rikirikmen.billsplit I/Objekt: 8 false 06-11 18: 02: 56.785 31338-31338/com. example.rikirikmen.billsplit I/Objekt: 9 false 06-11 18: 02: 56.785 31338-31338/com.beispiel.rikirikmen.billsplit I/Objekt: 10 false' –

+0

Das 'personInMenus' ist standardmäßig leer und ich habe es vergessen um es zu einem 'RealmList ', modifizierten Code – EpicPandaForce