[英]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()
失敗,則事務將被取消 ,這意味着您不會丟失所有數據。
就個人而言,我曾經采用“全部刪除”方法,如果你可以清除所有表格,那么它不會導致問題,但如果你有第三個表格,你指的是Conversation
和Message
(例如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.