我正在使用 room 将前台位置服务获取的数据与活动进行通信。该服务连接到视图模型并插入数据,但是该活动不会从视图模型接收更新的 LiveData,但是它能够在开始时获取 LiveData> 对象,并在重新启动应用程序时获取准确的大小。我在这里缺少什么?我需要将新数据插入数据库,所以如果我确实需要在服务和 postValue 中使用 MutableLiveData,那么我每次都必须发布整个列表......
活动.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()) );
} );
}
服务.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( ... ) ) );
}
数据道.java
@Dao
public interface DataDao {
@Query( "SELECT * FROM eData" )
LiveData<List<eData>> getAllData();
@Insert
long insertData( eData data );
}
应用程序数据库.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 在服务中插入实体时没有更新,它确实将其插入到数据库中,因为当我重新启动应用程序时,计数会增加。