Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android Room:错误:setValue(T)在LiveData中具有受保护的访问权限_Java_Android_Android Room - Fatal编程技术网

Java Android Room:错误:setValue(T)在LiveData中具有受保护的访问权限

Java Android Room:错误:setValue(T)在LiveData中具有受保护的访问权限,java,android,android-room,Java,Android,Android Room,我试着开始运行Android开发和Room 我正在制作一个带有播放列表和文件浏览器的音乐播放器应用程序,可以将曲目添加到当前播放列表中 我正在将播放列表保存在房间数据库中 我在第一次运行程序时遇到了一个问题,数据库中没有任何数据 我想在数据库中查询上次打开的播放列表,但如果数据库中没有播放列表,我想创建一个空的播放列表对象 7 public class PlayListRepository 8 { 9 public PlayListRepository(Appli

我试着开始运行Android开发和Room

我正在制作一个带有播放列表和文件浏览器的音乐播放器应用程序,可以将曲目添加到当前播放列表中

我正在将播放列表保存在房间数据库中

我在第一次运行程序时遇到了一个问题,数据库中没有任何数据

我想在数据库中查询上次打开的播放列表,但如果数据库中没有播放列表,我想创建一个空的播放列表对象

 7    public class PlayListRepository
 8    {
 9        public PlayListRepository(Application application)
10        {
11           _application = application;
12        }
13
14        public LiveData<PlayListWithTracks> getPlayList(int playListId)
15        {
16            if (_appDao == null) {
17                InitDb();
18            }
19            LiveData<PlayListWithTracks> livePlayListWithTracks = _appDao.getByIdWithTracks(playListId);
20            if (livePlayListWithTracks.getValue() == null) {
21                livePlayListWithTracks.setValue(new PlayListWithTracks());
22            }
23            return livePlayListWithTracks;
24        }
25
26
27        private void InitDb()
28        {
29            AppDatabase db = AppDatabase.getDatabase(_application);
30            _appDao = db.appDao();
31        }
32
33        private Application _application;
34        private AppDao _appDao;
35    }
我已尝试将
LivePlayWithTracks
转换为
MutableLiveData
,但这会导致运行时错误
androidx.room.RoomTrackingLiveData无法转换为androidx.lifecycle.MutableLiveData

我曾尝试将其转换为
RoomTrackingLiveData
,但Android Studio无法识别
androidx.room
导入

我走错方向了吗

编辑:以下是曲目播放列表:

public class PlayListWithTracks
{
    @Embedded
    public PlayList playList;
    @Relation(
            parentColumn = "id",
            entityColumn = "playListId"
    )
    public List<Track> tracks = new Vector<Track>();
}
带有曲目的公共类播放列表
{
@嵌入
公共播放列表;
@关系(
parentColumn=“id”,
entityColumn=“播放ID”
)
公共列表轨迹=新向量();
}

LiveData
表示数据库中的数据。如果从应用程序的任何其他部分修改数据库中的该条目,则
LiveData
将反映该更改。尝试将另一个值设置为
LiveData
,没有任何意义

如果不需要观察数据中的更改,则可能可以在数据访问对象中返回该对象。像这样:

@Dao
public interface AppDao
{
    @Transaction
    @Query("SELECT * FROM PlayList WHERE Id = :id")
    PlayListWithTracks getByIdWithTracks(int id);
}

也许更好的方法是在数据库中创建一个不存在的新播放列表条目,然后访问该条目。这意味着您可以使用函数中接收到的
id
将新的
playliWithTracks
实体添加到数据库中,然后访问该实体

show liveplayliWithTracks.setValue此方法。请发布viewModel类代码viewModel只调用上面不会编译的
getPlayList()
方法。如果有帮助的话,我发布了
playliWithTracks
。一般来说,如果你不创建
LiveData
,你就不能修改
LiveData
。在本例中,您没有创建
LiveData
——房间创建了。您使用的是Java,而不是Kotlin,这限制了您的选择。类似地,您在房间中使用的是
LiveData
,而不是RxJava,这限制了您的选择。可能您可以使用
转换.map()
(例如,在您的viewmodel中)来处理这种“提供默认结果”的情况。@MattGregory:“我认为修改数据是LiveData的用途”--是的,是针对
LiveData
的创建者,而不是消费者。在这种情况下,您只是消费者。“我应该在从数据库中获取LiveData类后立即将其删除吗?”--通常不会,因为这将是了解数据库更改的方式。但是,这取决于具体情况。“然后将有效负载包装在MutableLiveData中,因为我需要它来监视用户所做的更改?”--通常,您会将用户更改存储在数据库本身中。但是,这同样取决于场景。@MattGregory:您可以创建
LiveData
的子类,或者使用
MutableLiveData
,或者使用
MediatorLiveData
,作为
LiveData
的创建者和(可能)消费者。但是,如果你从其他人(如Room或其他图书馆)获得
LiveData
,你就是消费者。好吧,这已经开始有意义了。我将尝试在数据库中插入一条记录。谢谢
@Dao
public interface AppDao
{
    @Transaction
    @Query("SELECT * FROM PlayList WHERE Id = :id")
    PlayListWithTracks getByIdWithTracks(int id);
}