2015-07-06 12 views
9

Używam wersji Realms w wersji 0.81.1. Mam tej klasy:Realm.io - Jak zaktualizować obiekt?

public class KanjiComp extends RealmObject { 

    @PrimaryKey 
    private String character; 
    private String strokes; 
    private int frequency; 

    public String getCharacter() { 
     return character; 
    } 

    public void setCharacter(String character) { 
     this.character = character; 
    } 

    public String getStrokes() { 
     return strokes; 
    } 

    public void setStrokes(String strokes) { 
     this.strokes = strokes; 
    } 

    public int getFrequency() { 
     return frequency; 
    } 

    public void setFrequency(int frequency) { 
     this.frequency = frequency; 
    } 
} 

Po raz pierwszy, tworzę obiekt tak:

KanjiComp realmKanjiComp = realm.createObject(KanjiComp.class); 
    realmKanjiComp.setCharacter(cur.getString(cur.getColumnIndex("literal"))); 
    realmKanjiComp.setStrokes(cur.getString(cur.getColumnIndex("strokes"))); 
    realmKanjiComp.setFrequency(0); 

Chcę zwiększyć wartość częstotliwości. W tym celu potrzebuję metody, która pomoże mi zaktualizować częstotliwość.

dokumentacja Realm mówi tak:

Korzystanie z kluczy pierwotnych umożliwia korzystanie z createOrUpdate() metodę, która będzie szukać istniejącego obiektu z tego klucza podstawowego, aktualizacja to jeżeli stwierdzi jedną ; jeśli żaden nie zostanie znaleziony, utworzy nowy obiekt .

Ale nie mogłem znaleźć metody createOrUpdate(). Wszystkie metody pracy z JSON. enter image description here

mój pełny kod wygląda następująco:

 try { 
      KanjiComp realmKanjiComp = realm.createObject(KanjiComp.class); 
      character = cur.getString(cur.getColumnIndex("literal")); 
      realmKanjiComp.setCharacter(cur.getString(cur.getColumnIndex("literal"))); 
      realmKanjiComp.setStrokes(cur.getString(cur.getColumnIndex("strokes"))); 
      realmKanjiComp.setFrequency(0); 
     } catch (Exception e) { 
      RealmQuery<KanjiComp> query = realm.where(KanjiComp.class); 
      query.equalTo("character", character); 
      RealmResults<KanjiComp> rKanjiComp = query.findAll(); 
      KanjiComp oldKanjiComp = rKanjiComp.get(0); 

      KanjiComp realmKanjiComp = realm.update(KanjiComp.class);//update is underlined 
      realmKanjiComp.setCharacter(cur.getString(cur.getColumnIndex("literal"))); 
      realmKanjiComp.setStrokes(cur.getString(cur.getColumnIndex("strokes"))); 
      realmKanjiComp.setFrequency(oldKanjiComp.getFrequency()+1); 
     } 

Więc moje pytanie brzmi, jak zaktualizować wartość mojego obiektu? Czy istnieje sposób na zwiększenie wartości mojego obiektu?

+1

Spróbuj owinąć go w transakcji. realm.executeTransaction (nowa Realm.Transaction() { @Override public void execute (Realm realm) { KanjiComp testObject = realm.createObject (KanjiComp.class); testObject.setValue (value); realm.copyToRealmOrUpdate (testObject); } }); –

+0

Dziękuję, Maksim! –

Odpowiedz

15

pójdę z czymś takim:

void createKanjiCompOrUpdateFrequency() { 
    // This query is fast because "character" is an indexed field 
    KanjiComp kanjoComp = realm.where(KanjiComp.class) 
           .equalTo("character", someValue) 
           .findFirst(); 
    realm.beginTransaction(); 
    if (kanjiComp == null) { 
     KanjiComp kanjiComp = realm.createObject(KanjiComp.class); 
     // set the fields here 
    } else { 
     kanjiComp.setFrequency(kanjiComp.getFrequency() + 1); 
    } 
    realm.commitTransaction(); 
} 
Powiązane problemy