insert()和createObject()有什么区别?

时间:2017-10-10 22:15:41

标签: java android realm

我有一个setChatsList()方法,它有一个巨大的代码:

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);
        }
    });
}

正常工作!

只需阅读有关方法insert()的官方文档,也可以在数据库中存储。我重写了setChatsList()方法:

public void setChatsList(final ChatsModel chatsModel) {
    Realm realm = Realm.getDefaultInstance();
    realm.executeTransaction(new Realm.Transaction() {
        @Override
        public void execute(@NonNull Realm realm) {
            realm.insert(chatsModel);
        }
    });
}

令我惊讶的是,它也运行良好,而且代码更少!

但我确信并非所有事情都如此顺利,我认为某处有一个问题。

问题:insert()createObject()之间的区别是什么?

2 个答案:

答案 0 :(得分:2)

  

insert()

将非托管对象保存到Realm中(托管对象为no-op),不带创建托管代理对象作为返回值。

  

的CreateObject()

在Realm中创建一个托管对象,并将代理返回给此托管对象。

  

copyToRealm()

将非托管对象保存到Realm中,使用将代理返回到创建的托管对象。

insert()copyToRealm()之间的主要区别在于是否返回代理;这意味着通过重新使用单个非托管对象并使用正确的参数调用insert(),可以更有效地插入许多项。

但是,如果要在对象之间建立关系,通常需要createObject()

PS insert / copyToRealm / createObject(clazz)对象有insertOrUpdatecopyToRealmOrUpdatecreateObject(clazz, primaryKeyValue)对象主键。

答案 1 :(得分:0)

假设您将主键设为整数

0 是int字段的默认值,因此如果你有一个RealmObject,其值为0,则意味着realm.createObject(YourRealmClass.class)将失败并出现下面提到的错误。

RealmPrimaryKeyConstraintException:值已存在:
因为它将创建一个具有默认值的对象。

创建RealmObjects的更好方法是什么?

copyToRealmOrUpdate() insert()。 我会建议你使用 copyToRealmOrUpdate()因为。如果记录存在或不存在,最好先使用它。如果记录存在则会更新如果记录未退出则会插入新记录。

相关问题