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



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

insert()

将非托管对象保存到Realm中(托管对象没有操作),而不创建托管代理对象作为返回值。

createObject()

在Realm中创建一个托管对象,并向该托管对象返回一个代理。

copyToRealm()

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


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

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

p.S.insert/copyToRealm/createObject(clazz)对于具有主键的对象具有对应的insertOrUpdatecopyToRealmOrUpdatecreateObject(clazz, primaryKeyValue)

假设主键为整数

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

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

创建RealmObjects的更好方法是什么

copyToRealmOrUpdate()插入()。我建议您使用copyToRealmOrUpdate(),因为。它最好在第一次检查记录是否存在时使用。若记录存在,则它将更新;若记录不存在,则插入新记录。

最新更新