«значение» не является допустимым управляемым объектом. в области при сохранении списка

#android #arraylist #realm #local-storage

#Android #arraylist #область #локальное хранилище

Вопрос:

 public class User
    extends RealmObject  {
@PrimaryKey
private long id;
@Index

private String name;

private RealmList<MessageDetails> messageDetails;
//getter setter here

}
  

MessageDetails.class здесь

 public class MessageDetails   extends  RealmObject  {
private Boolean isIncoming;
private String lastPosLeft;
private String message;
// getter setter here`}
  

нажмите кнопку для обновления списка

  int   pos = myData.size();
            mDetails = new MessageDetails();
            mDetails.setMessage(etMessage.getText().toString());
            mDetails.setIncoming(msgInOrOutBoolean);
            mDetails.setLastPos(msgTypeOutgoingOrIncoming);
            
            myData.add(pos,mDetails);
updateMsgInRealm();
  

** обновить список **

  private void updateMsgInRealm() {
    Realm realm = RealmManager.getRealm();
    realm.executeTransaction(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            final User user = realm.where(User.class).equalTo("id", mPref.getCurrentSelectedUserId()).findFirst();

            assert user != null;
            user.setMessageDetails(myData);

        }
    });
}
  

журналы

 e  java.lang.IllegalArgumentException: 'value' is not a valid managed object.
    at io.realm.ProxyState.checkValidObject(ProxyState.java:213)
    at io.realm.com_example_dummychatapp_realm_UserRealmProxy.realmSet$messageDetails(com_example_dummychatapp_realm_UserRealmProxy.java:248)
    at com.example.dummychatapp.realm.User.setMessageDetails(User.java:54)
    at com.example.dummychatapp.MainActivity$2.execute(MainActivity.java:156)
    at io.realm.Realm.executeTransaction(Realm.java:1493)
    at com.example.dummychatapp.MainActivity.updateMsgInRealm(MainActivity.java:149)
    at com.example.dummychatapp.MainActivity.onClick(MainActivity.java:217)
    at android.view.View.performClick(View.java:6710)
    at android.view.View.performClickInternal(View.java:6668)
    at android.view.View.access$3400(View.java:797)
    at android.view.View$PerformClick.run(View.java:26450)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
  

Здесь mPref.getCurrentSelectedUserId() id хранится в sharedPrefance
я получил ошибку при сохранении RealmList .

пожалуйста, если кто-нибудь может помочь мне сохранить список в realm db, я попробовал некоторый код, но у меня не работает, если какой-либо пример кода, который соответствует моему требованию, предложит мне здесь.

Комментарии:

1. Я думаю, вам не следует заменять весь список пользователей каждый раз, когда вы добавляете одно сообщение (с точки зрения производительности). попробуйте user.setMessageDetails().add(mDetails); // передайте mDetails в updateMsgInRealm. Аналогичный пример:- dzone.com/articles/realm-practical-use-in-android 2-й пример Университет<>Студент

2. но у меня есть список сообщений для каждого пользователя, поэтому. мне нужно сохранить его как list или array-list или realm-list

3. я пробую этот user.setMessageDetails((RealmList<MessageDetails>) realm.copyToRealm(myData)); но его список аварийного отображения не может быть преобразован в realmList

4. вы можете ссылаться dzone.com/articles/realm-practical-use-in-android 2-й пример. Студент<> Университет

5. спасибо, приятель, за ваше драгоценное время

Ответ №1:

эй, я получил решение, потратив весь свой день, чувак, здесь я перечислил проблему

здесь я поступил неправильно

 enter int   pos = myData.size();
        mDetails = new MessageDetails();
        mDetails.setMessage(etMessage.getText().toString());
        mDetails.setIncoming(msgInOrOutBoolean);
        mDetails.setLastPos(msgTypeOutgoingOrIncoming);
        
        myData.add(pos,mDetails);
  

** используйте это **

                     MessageDetails mDetails = realm.createObject(MessageDetails.class);
 mDetails.setMessage(etMessage.getText().toString());
        mDetails.setIncoming(msgInOrOutBoolean);
        mDetails.setLastPos(msgTypeOutgoingOrIncoming);
        
        myData.add(pos,mDetails);
  

** и все, что вам нужно, это поместить приведенный выше код внутрь **

 realm.executeTransaction(new Realm.Transaction() {
    @Override
    public void execute(Realm realm) {

       // here you need to use above code 

        final User user = realm.where(User.class).equalTo("id", mPref.getCurrentSelectedUserId()).findFirst();

        assert user != null;
        user.setMessageDetails(myData);

    }
});