レルム内のテーブル全体を更新するために何をしているのかが正しい安全なアプローチであるかどうかは不思議でした。私はこのように私のデシベルをサーバから会話のリストを受け取り、更新:レルムテーブルの更新
public class Conversation extends RealmObject {
private RealmList<Message> messages = new RealmList<>();
これは動作しますが、私はすべてのバグを見つけることができませんでした:
@Override
public void saveConversations(final List<Conversation> conversations) {
realm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
// Remove all conversations and replace with the one passed in
// Realm does not support cascade deletes. Remove messages as well
// https://github.com/realm/realm-java/issues/1104
realm.delete(Conversation.class);
realm.delete(Message.class);
realm.copyToRealmOrUpdate(conversations);
}
});
}
Conversation.javaは、内部メッセージのRealmListを持っていますそれは特にエレガントに見えません。 realm.copyToRealmOrUpdate(conversations);
が間違っていたらどうなりますか?私はすべての自分のデータを失うだろう。
とにかく、これはあまり起こりそうもないことを知っていますが、より良いやり方があるのだろうかと思っていました。
PS:データベースには存在しない会話はもう望んでいないので、データベースからすべてを削除することに注意してください。
は、それはかなりクールな機能だが、それは成功しなかった場合、トランザクションは元に戻すことになる気づいていませんでした。あなたのアプローチを共有してくれてありがとうございます。 – feresr
うん、それは 'executeTransaction()'と同じです。それ以外の場合は、 'realm.beginTransaction()'、 'realm.commitTransaction()'、 'realm.cancelTransaction()'です。例では、失敗したときに書き込みトランザクションをキャンセルすることが非常に重要であるにもかかわらず、エラーで 'realm.cancelTransaction()'を無視することがよくあります。 – EpicPandaForce