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