簡體   English   中英

更新領域表

[英]Update realm table

我只是想知道我在做什么來更新整個表格是正確的安全方法。 我從服務器收到一個對話列表,並像這樣更新我的數據庫:

@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消息:

public class Conversation extends RealmObject {

    private RealmList<Message> messages = new RealmList<>();

這有效,我找不到它的任何錯誤,但它看起來不是特別優雅。 如果是realm.copyToRealmOrUpdate(conversations);怎么realm.copyToRealmOrUpdate(conversations); 出錯? 我會丟失所有數據。

無論如何,我知道這不太可能,但我想知道是否有更好的做事方式。

PS:請記住,我從數據庫中刪除了所有內容,因為我不希望我的數據庫中的對話不再存在於服務器中。

不要忘記您正在執行事務,因此如果copyToRealmOrUpdate()失敗,則事務將被取消 ,這意味着您不會丟失所有數據。

就個人而言,我曾經采用“全部刪除”方法,如果你可以清除所有表格,那么它不會導致問題,但如果你有第三個表格,你指的是ConversationMessage (例如User.class ),你將使所有關系無效。 所以我個人更喜歡像這樣合並。

  • 合並數據並刪除不在您保存的列表中的所有數據

public class Contact {
    @PrimaryKey
    private long id;

    @Index
    private String name;

    @Index
    private String phoneNumber;

    @Index
    private boolean isBeingSaved; // this line is important

    //getters, setters
}

然后合並:

// background thread
Realm realm = null;
try {
    realm = Realm.getDefaultInstance();
    final List<Contact> contacts = getContacts();
    realm.executeTransaction(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            realm.insertOrUpdate(contacts);
            realm.where(Contact.class)
                 .equalTo(ContactFields.IS_BEING_SAVED, false) // compile 'dk.ilios:realmfieldnameshelper:1.1.0'
                 .findAll()
                 .deleteAllFromRealm(); // delete all non-saved data
                        // in your case, this is where you'd handle the cascading too though manually
            for(Contact realmContact : realm.where(Contact.class).findAll()) { // realm 0.89.0+
                realmContact.setIsBeingSaved(false); // reset all save state
            }
        }
    });
} finally {
    if(realm != null) {
        realm.close();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM