2017-10-10 90 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();'然後它返回幾個副本,也就是每次插入新條目並且不更新。 –

相關問題