如何在Realm中正确写入数据?

时间:2017-10-11 20:44:43

标签: java android realm

我有一种在Realm中编写数据的方法:

public void setChatsList(final ChatsModel chatsModel) {
    Realm realm = null;

    try {
        realm = Realm.getDefaultInstance();

        realm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                realm.copyToRealmOrUpdate(chatsModel);
            }
        });

    } finally {
        if (realm != null) {
            realm.close();
        }
    }
}

我用这种方法从数据库中读取数据:

ChatsModel getAllChatsList() {
    Realm realm = Realm.getDefaultInstance();
    RealmResults<ChatsModel> chatsModelResult = realm.where(ChatsModel.class).findAll();

    ChatsModel chatsModel = chatsModelResult.get(0);

    return chatsModel;
}

当我使用copyToRealmOrUpdate()方法写入数据库时​​,它不会保存。也就是说,当您在方法中获取数据时,getAllChatsList()将返回0.

当我使用insertOrUpdate()方法进行编写时,每次写入时,即使它们具有相同的数据,它也不会更新现有记录,而是将其写入前一个记录

为什么条目数增加。虽然是同一个对象。好吧,如果有一个列表,但我只有一个对象并获得最后一条记录,我这样做:

ChatsModel chatsModel = chatsModelResult.get(chatsModelResult.size() - 1);

为什么呢?我不能在不发送论证的情况下阅读 - chatsModelResult.size() - 1

问题:如何解决写作和阅读问题?

1 个答案:

答案 0 :(得分:1)

ChatsModel getAllChatsList() {
    Realm realm = Realm.getDefaultInstance(); // <-- realm instance never closed
    RealmResults<ChatsModel> chatsModelResult = realm.where(ChatsModel.class).findAll();

    ChatsModel chatsModel = chatsModelResult.get(0);

    return chatsModel;
}

通过在非looper后台线程上打开未关闭的Realm实例,您的版本将保留在旧版本的Realm上,并且无法自行更新。

可能是正确的生命周期管理,或者调用realm.refresh()