2017-10-10 88 views
2

我有一个setChatsList()方法,它有一个庞大的代码:正确insert()和createObject()之间有什么区别?

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()有什么区别?

+0

'insert'会自动插入整个对象层次结构,所以所有对象都必须是Realm对象。 'createObject()'单独创建每个对象,给予更大的灵活性。如果你可以使用'insert'或'insertOrUpdate',那会更好。 –

回答

1

刀片()

保存非托管对象插入到域(管理对象是无操作),不创建管理代理对象作为返回值。

的CreateObject()

创建在领域被管理对象,并返回一个代理到这个管理对象。

copyToRealm()

保存非托管对象进入境界,返回代理所创建的管理对象。


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

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

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

0

假设你有主密钥作为整数

为int字段的默认值,因此,如果有一个与RealmObject 0作为值,那么,这意味着realm.createObject(YourRealmClass.class)会因下面提到的错误而失败。

RealmPrimaryKeyConstraintException:值已经存在:
,因为它会创建一个默认值的对象。

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

copyToRealmOrUpdate()插入件()。 因为我会推荐你​​使用copyToRealmOrUpdate()。因为它首先检查记录是否存在,所以最好使用它。如果记录存在,则它将更新,如果记录不存在,将插入新记录。

+0

如果'insertOrUpdate()'处理任务是必要的,那么方法'createObject()怎么办? –

+0

它也插入数据,但是当你在领域表中有主键时它会给你带来问题。否则,两者工作相同。我刚刚向你解释了更好的代码实践。 –

+0

为什么然后当我从数据库读取chatsModelResult时:'RealmResults chatsModelResult = realm.where(ChatsModel.class).findAll();'然后它返回几个副本,也就是每次插入新条目并且不更新。 –

相关问题