我只是想知道,我所做的更新整个领域中的表是否是正确的安全方法。我收到来自服务器的对话列表,并按如下方式更新我的db:
@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<>();这是可行的,我找不到任何but与它,但它看起来并不特别优雅。如果realm.copyToRealmOrUpdate(conversations);出了问题怎么办?我会失去我所有的数据。
无论如何,我知道这不太可能,但我想知道是否有更好的方法做事情。
PS:请记住,我删除了数据库中的所有内容,因为我不希望数据库中的会话不再存在于服务器中。
发布于 2016-09-15 08:53:54
不要忘记您正在执行一个事务,所以如果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();
}
}https://stackoverflow.com/questions/39501240
复制相似问题