#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);
}
});