【问题标题】:Realm.io - How to update object?Realm.io - 如何更新对象?
【发布时间】:2015-07-06 09:11:49
【问题描述】:

我使用的是 0.81.1 版本的 Realm。我有这门课:

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

我第一次创建这样的对象:

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

我想增加频率值。为此,我需要帮助我更新频率的方法。

Realm 文档是这样说的:

使用主键可以使用 createOrUpdate() 方法,它将查找具有此主键的现有对象, 如果找到一个更新它;如果没有找到,它将创建一个新的 而是对象。

但我找不到 createOrUpdate() 方法。使用 JSON 的所有方法。

我的完整代码如下所示:

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

所以我的问题是,如何更新我的对象的值?有什么方法可以增加我的对象的价值吗?

【问题讨论】:

  • 尝试将其包装在事务中。 realm.executeTransaction(new Realm.Transaction() { @Override public void execute(Realm realm) { KanjiComp testObject = realm.createObject(KanjiComp.class); testObject.setValue(value); realm.copyToRealmOrUpdate(testObject); } }) ;

标签: android realm


【解决方案1】:

我会选择这样的:

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

【讨论】:

  • 字符字段的类型是什么? ...我认为我们无法将 char 保存在领域中..您是否使用 String 来替代 char?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-12
  • 1970-01-01
相关资源
最近更新 更多