【发布时间】:2019-12-21 00:50:28
【问题描述】:
我正在使用房间将前台位置服务获取的数据与活动进行通信。该服务连接到视图模型并插入数据,但是活动没有从视图模型接收更新的 LiveData,但是它能够在开始时获取 LiveData> 对象,并在重新启动应用程序时具有准确的大小。我在这里想念什么?我需要向数据库中插入新数据,所以如果我确实需要在服务和 postValue 中使用 MutableLiveData,那么我每次都必须发布整个列表...
Activity.java
@Override
protected void onCreate( Bundle savedInstanceState ) {
super.onCreate( savedInstanceState );
setContentView( R.layout.track_activity );
mViewModel = ViewModelProviders.of( this ).get( ViewModel.class );
mViewModel.getAllData().observe( this, ( @Nullable final <List<eData>> data ) -> {
if ( data!= null )
Log.d("DATACOUNT", String.valueOf(data.size()) );
} );
}
Service.java
@Override
public void onCreate() {
super.onCreate();
AppDatabase mDB = AppDatabase.getDatabase( this.getApplication() );
mDataDao = mDB.dataDao();
mExecutor = Executors.newSingleThreadExecutor();
}
...
private void receiveLocation( LocationResult locationResult ) {
...
mExecutor.execute( () -> mDataDao.insertData( new eData( ... ) ) );
}
DataDao.java
@Dao
public interface DataDao {
@Query( "SELECT * FROM eData" )
LiveData<List<eData>> getAllData();
@Insert
long insertData( eData data );
}
AppDatabase.java
@Database(entities = { eData.class }, version = 1 )
public abstract class AppDatabase extends RoomDatabase {
public abstract DataDao dataDao();
private static AppDatabase INSTANCE;
public static AppDatabase getDatabase( final Context context ) {
if ( INSTANCE == null ) {
synchronized ( AppDatabase.class ) {
if ( INSTANCE == null ) {
INSTANCE = Room.databaseBuilder( context.getApplicationContext(),
AppDatabase.class, "locationapp" )
.build();
}
}
}
return INSTANCE;
}
存储库和数据库是单例的。但是不知何故,在我的活动中观察到的 LiveData 在服务中插入实体时并没有更新,它确实插入到数据库中,因为当我重新启动应用程序时,计数会增加。
【问题讨论】:
-
您的服务应该直接与 DAO(或存储库,无论您使用哪个)对话,并且应该没有 ViewModel。此外,此问题中缺少您的 DAO 声明,因此我们无法知道您与 Room DAO 使用的集成类型。
-
我已经添加了声明,并测试了直接与它对话。 Activity 中的 LiveData 仍然不会更新行数。
-
是的,通过查看数据库和重新启动应用程序/活动,行数都会上升到以前的最大值。只是在服务运行和插入时不更新....
-
@Flecibel 你解决了这个问题吗?我正在经历类似的事情
-
@rial 查看此答案:stackoverflow.com/a/44958478/7987898 确保您使用相同的 DAO 实例来插入和侦听更新。该服务必须使用与视图模型相同的实例。
标签: java android android-service android-room