首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新领域表

更新领域表
EN

Stack Overflow用户
提问于 2016-09-14 23:45:47
回答 1查看 355关注 0票数 1

我只是想知道,我所做的更新整个领域中的表是否是正确的安全方法。我收到来自服务器的对话列表,并按如下方式更新我的db:

代码语言:javascript
复制
@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:

代码语言:javascript
复制
public class Conversation extends RealmObject {

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

这是可行的,我找不到任何but与它,但它看起来并不特别优雅。如果realm.copyToRealmOrUpdate(conversations);出了问题怎么办?我会失去我所有的数据。

无论如何,我知道这不太可能,但我想知道是否有更好的方法做事情。

PS:请记住,我删除了数据库中的所有内容,因为我不希望数据库中的会话不再存在于服务器中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-15 08:53:54

不要忘记您正在执行一个事务,所以如果copyToRealmOrUpdate()失败,那么事务就是取消的,这意味着您不会丢失所有数据。

就我个人而言,我曾经使用“删除所有”的方法,如果您可以清除所有表,那么它不会引起问题,但是如果您有第三个表,其中您指的是ConversationMessage (例如User.class),那么您将使所有关系无效。所以我个人更喜欢这样合并。

  • 合并数据并删除所有不在保存列表中的数据

代码语言:javascript
复制
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
}

然后合并:

代码语言:javascript
复制
// 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();
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39501240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档