【问题标题】:How to save related classes in Realm?如何在 Realm 中保存相关类?
【发布时间】:2017-10-07 21:43:32
【问题描述】:

我最近开始使用Realm。首先很清楚,如果你存储一个类,也就是一个对象。但是当你想在字段中存储具有自定义类型的类时,它们具有相同的东西。

即:

class Dog extend RealmObject{
private int count;
private Cat cat;

// геттеры и сеттеры
}

class Cat extend RealmObject{
private int count;
private RealmList<Cow> cowList;

// геттеры и сеттеры
}

class Cow extend RealmObject{
private int count;
private Horse horse;

// геттеры и сеттеры
}

所以,为了将这个保存在数据库中,写了一堆代码:

public void setChatsList(final ChatsModel chatsModel) {
    Realm realm = Realm.getDefaultInstance();

    realm.executeTransaction(new Realm.Transaction() {
        @Override
        public void execute(@NonNull Realm realm) {

            ChatsModel realmChats = realm.createObject(ChatsModel.class);
            Response realmResponse = realm.createObject(Response.class);
            Item realmItem = realm.createObject(Item.class);
            Message realmMessage = realm.createObject(Message.class);
            Attachment realmAttachment = realm.createObject(Attachment.class);
            Video realmVideo = realm.createObject(Video.class);

            Response response = chatsModel.getResponse();
            RealmList<Item> items = new RealmList<>();
            Integer itemCount = response.getCount();
            RealmList<Item> itemList = response.getItems();

            if (itemList != null) {
                for (Item item : itemList) {
                    Message message = item.getMessage();

                    realmMessage.setId(message.getId());
                    realmMessage.setDate(message.getDate());
                    realmMessage.setOut(message.getOut());
                    realmMessage.setUserId(message.getUserId());
                    realmMessage.setReadState(message.getReadState());
                    realmMessage.setTitle(message.getTitle());
                    realmMessage.setBody(message.getBody());
                    realmMessage.setRandomId(message.getRandomId());
                    RealmList<Attachment> attachments = message.getAttachments();
                    RealmList<Attachment> attachmentList = new RealmList<>();

                    if (attachments != null) {
                        for (Attachment attachment : attachments) {
                            String type = attachment.getType();
                            Video video = attachment.getVideo();

                            realmVideo.setAccessKey(video.getAccessKey());
                            realmVideo.setCanAdd(video.getCanAdd());
                            realmVideo.setCanEdit(video.getCanEdit());
                            realmVideo.setComments(video.getComments());
                            realmVideo.setDate(video.getDate());
                            realmVideo.setDescription(video.getDescription());
                            realmVideo.setDuration(video.getDuration());
                            realmVideo.setId(video.getId());
                            realmVideo.setOwnerId(video.getOwnerId());
                            realmVideo.setPhoto130(video.getPhoto130());
                            realmVideo.setPhoto320(video.getPhoto320());
                            realmVideo.setPhoto640(video.getPhoto640());
                            realmVideo.setPlatform(video.getPlatform());
                            realmVideo.setTitle(video.getTitle());
                            realmVideo.setViews(video.getViews());

                            realmAttachment.setType(type);
                            realmAttachment.setVideo(realmVideo);

                            attachmentList.add(realmAttachment);
                        }
                        realmMessage.setAttachments(attachmentList);
                    }

                    realmResponse.getItems().add(item);
                }
            }

            realmResponse.setCount(itemCount);
            realmChats.setResponse(realmResponse);
        }
    });
}

同意一项任务的行太多。在我看来,我做错了

问题:如何正确做,如何缩短我的方法,告诉我?

【问题讨论】:

  • 除了attachmentList 看起来有问题并且 Realm 实例在完成后没有关闭之外,它看起来还可以
  • @EpicPandaForce,但attachmentList 有什么问题?
  • realmMessage 是托管对象,但 attachmentList 是非托管 RealmList。应该是realmMessage.getAttachments().addAll(attachmentList)
  • 即为每个类创建一个表?虽然我不直接直接联系他们
  • ...嗯?我从来没有说过这样的话

标签: java android realm realm-mobile-platform


【解决方案1】:

我可能遗漏了一些更详细的信息,但看起来您只是在 1:1 映射响应。有什么理由不能直接使用吗?

ChatsModel realmChats = realm.createObject(ChatsModel.class);
realmChats.addResponse(chatsModel.getItems());

Realm 会自动将非托管列表转换为托管列表。

【讨论】:

  • 因为当我这样做时:ChatsModel realmChats = realm.createObject(ChatsModel.class); realmChats.setResponse(chatsModel.getResponse()); 我得到这个错误:`java.lang.IllegalArgumentException: 'value' is not a valid managed object.`
  • 如果我按照上面在问题中写的方式写,它可以正常工作
猜你喜欢
  • 1970-01-01
  • 2014-06-29
  • 1970-01-01
  • 2016-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多