10

How we can store java list in realm android database. I try to store it by using setter method present in my model, but it doesn't work and I get "Each element of 'value' must be a valid managed object" in exception message.

public void storeNewsList(String categoryId, List<News> newsList) { 
    Realm realm = Realm.getDefaultInstance(); 
    realm.beginTransaction(); 
    NewsList newsListObj = realm.createObject(NewsList.class); 
    newsListObj.setNewsList(new RealmList<>(newsList.toArray(new News[newsList.size()]))); 
    newsListObj.setCategoryId(categoryId); 
    realm.commitTransaction(); 
    realm.close(); 
} 
EpicPandaForce
  • 79,669
  • 27
  • 256
  • 428
Anil
  • 255
  • 1
  • 3
  • 14
  • Share your code what you have done? – Meenal May 02 '17 at 12:52
  • public void storeNewsList(String categoryId, List newsList) { Realm realm = Realm.getDefaultInstance(); realm.beginTransaction(); NewsList newsListObj = realm.createObject(NewsList.class); newsListObj.setNewsList(newsListObj.setNewsList(new RealmList<>(newsList.toArray(new News[newsList.size()])));); newsListObj.setCategoryId(categoryId); realm.commitTransaction(); realm.close(); } – Anil May 02 '17 at 12:57

2 Answers2

14

Replace code with

public void storeNewsList(String categoryId, List<News> newsList) { 
    try(Realm realm = Realm.getDefaultInstance()) { 
        realm.executeTransaction(new Realm.Transaction() {
             @Override
             public void execute(Realm realm) {
                 NewsList newsListObj = new NewsList(); // <-- create unmanaged
                 RealmList<News> _newsList = new RealmList<>();
                 _newsList.addAll(newsList);
                 newsListObj.setNewsList(_newsList); 
                 newsListObj.setCategoryId(categoryId);
                 realm.insert(newsListObj); // <-- insert unmanaged to Realm
             }
        }); 
    }
} 
EpicPandaForce
  • 79,669
  • 27
  • 256
  • 428
1

In case if you're using @PrimaryKey then insertOrUpdate will do the trick

try(Realm realm = Realm.getDefaultInstance()) {
                        realm.executeTransaction(new Realm.Transaction() {
                            @Override
                            public void execute(Realm realm) {
                                 RealmList<News> _newsList = new RealmList<>();
                                _newsList.addAll(myCustomArrayList);
                                realm.insertOrUpdate(_newsList); // <-- insert unmanaged to Realm

                            }
                        });
                    }
Aks4125
  • 4,522
  • 4
  • 32
  • 48