代码之家  ›  专栏  ›  技术社区  ›  Oktawian

如何将realmobject添加到realmist?

  •  0
  • Oktawian  · 技术社区  · 6 年前

    我尝试将SongRealm添加到SongListRealm,如下所示:

    public void insertSongToListWithKey(final int key, Song song){
        final SongRealm songRealm = mapper.toRealm(song);
        realm.beginTransaction();
    
        SongListRealm songListRealm = realm.where(SongListRealm.class).equalTo("key", key).findFirst();
        if(songListRealm!=null){
            songListRealm.getSongList().add(songRealm);
            realm.insertOrUpdate(songListRealm);
        }
    
        realm.commitTransaction();
    }
    

    之前:

    歌曲列表名为“A”歌曲名为“1”,歌曲名为“2”

    歌曲列表名为“B”歌曲名为“14”

    后:

    歌曲列表名为“A”歌曲名为“4”,歌曲名为“4”

    歌曲列表名为“B”歌曲名为“4”,歌曲名为“4”

    我做错什么了?祝你晚上愉快。提前谢谢你。

    编辑

    我正在添加更多代码:)

    SongListMapper(类更改SongList上的SongListRealm)方法:

    public SongList fromRealm(SongListRealm songListRealm){
        SongList songList = new SongList();
        ArrayList<Song> songArrayList = new ArrayList<>();
        RealmList<SongRealm> realmSongList = songListRealm.getSongList();
        for(SongRealm songRealm: realmSongList){
            songArrayList.add(songMapper.fromRealm(songRealm));
        }
        songList.setSongList(songArrayList);
        songList.setTitle(songListRealm.getName());
        songList.setKey(songListRealm.getKey());
        return songList;
    }
    

    SongMapper(在Song上更改SongRealm的类,反之亦然):

    public Song fromRealm(SongRealm songRealm){
        Song song = new Song();
        song.setArtist(songRealm.getArtist());
        song.setId(songRealm.getId());
        song.setPath(songRealm.getPath());
        song.setTitle(songRealm.getTitle());
        return song;
    }
    

    getAllTheSongLists()方法:

    public ArrayList<SongList> getAllTheSongLists() {
        ArrayList<SongList> songs = new ArrayList<>();
        SongListMapper mapper = new SongListMapper();
        RealmResults<SongListRealm> all = realm.where(SongListRealm.class).findAll().sort("key");
        for (SongListRealm songRealm : all) {
            if(songRealm.getKey()==idLastSongListValue)
                continue;
            songs.add(mapper.fromRealm(songRealm));
        }
        return songs;
    }
    

    我在idlastSongListValue变量中保存键为的上次使用的SongList,所以它不是用户创建的SongList,我不想为用户显示它。

    [解决]

    我必须用新的主键创建新的对象,并将song对象的变量设置为创建songrealm对象和从epicpandaforce复制方法。希望它能帮助你。

    public void insertSongToListWithKey(final int key, final Song song){
        realm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm r) {
                SongRealm songRealmNew = createSongRealm(song);
                SongListRealm songListRealm = realm.where(SongListRealm.class).equalTo("key", key).findFirst();
                if (songListRealm != null) {
                    SongRealm savedSongRealm = realm.copyToRealmOrUpdate(songRealmNew);
                    RealmList<SongRealm> songs = songListRealm.getSongList();
                    if(!songs.contains(savedSongRealm)) {
                        songs.add(savedSongRealm);
                    }
                }
            }
        });
    }
    
    private SongRealm createSongRealm(Song song){
        SongRealm songRealmNew = realm.createObject(SongRealm.class, generateIdForSong());
        songRealmNew.setId(song.getId());
        songRealmNew.setTitle(song.getTitle());
        songRealmNew.setPath(song.getPath());
        songRealmNew.setArtist(song.getArtist());
        return songRealmNew;
    }
    
     private int generateIdForSong() {
        if(realm.where(SongRealm.class).max("key")==null)
            return 0;
        return realm.where(SongRealm.class).max("key").intValue() + 1;
     }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   EpicPandaForce    6 年前

    public void insertSongToListWithKey(final int key, Song song){
        final SongRealm songRealm = mapper.toRealm(song);
        realm.executeTransaction((r) -> {
            SongListRealm songListRealm = realm.where(SongListRealm.class).equalTo("key", key).findFirst();
            if(songListRealm != null) {
                SongRealm savedSongRealm = realm.copyToRealmOrUpdate(songRealm);
                RealmList<SongRealm> songs = songListRealm.getSongList();
                if(!songs.contains(savedSongRealm)) {
                    songs.add(savedSongRealm);
                }
            }
        });
    }