Java insert()和createObject()之间有什么区别?

Java insert()和createObject()之间有什么区别?,java,android,realm,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

我有一个
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()
createObject()
之间有什么区别?

假设主键是整数

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

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

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

copyToRealmOrUpdate()或insert()。 我建议您使用copyToRealmOrUpdate(),因为。最好先使用,因为它会检查记录是否存在。若记录存在,那个么它将更新,若记录不存在,它将插入新记录

插入()

将非托管对象保存到域中(托管对象不是op),而不创建托管代理对象作为返回值

createObject()

在领域中创建托管对象,并返回此托管对象的代理

copyToRealm()

将非托管对象保存到域中,,并向创建的托管对象返回代理


insert()
copyToRealm()
之间的关键区别在于是否返回代理;这意味着通过重新使用单个非托管对象并使用正确的参数对其调用
insert()
,插入多个项的效率要高得多

但是,如果要设置对象之间的关系,通常需要
createObject()


p.S.
insert
/
copyToRealm
/
createObject(clazz)
有一个对应的
insertOrUpdate
copyToRealmOrUpdate
createObject(clazz,primaryKeyValue)
对于具有主键的对象。

那么方法
createObject()如果
insertOrUpdate()`处理一个任务是必要的吗?它也可以插入数据,但当您在领域表中有主键时,它会给您带来问题。否则,两者的工作原理相同。我刚刚向您解释了更好的代码实践。那么,当我从数据库中读取chatsModelResult时,为什么会这样做:
RealmResults chatsModelResult=realm.where(ChatsModel.class).findAll()然后它返回多个副本,也就是说,每次它插入新条目并且不更新。您的代码已经足够好了。我并不是说你必须改变你的密码。我只是告诉你们哪种方式更合适,因为有时我会得到一些信息不完整的数据,当我们收到更新的数据时,我们就不必检查和更新记录了。我刚刚告诉了你一个很好的方法,因为我在代码中也使用了它。注意,如果你不打算使用返回值,我们还有
insertOrUpdate
,它比
copyToRealmOrUpdate
快得多。
insert
自动插入整个对象层次结构,因此所有对象都必须是领域对象
createObject()
分别创建每个对象,提供了更大的灵活性。如果您可以使用
insert
insertOrUpdate
,则更可取。
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);
        }
    });
}