【问题标题】:Insert to room in service not updating LiveData in activity插入服务中的房间而不更新活动中的 LiveData
【发布时间】: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


【解决方案1】:

最终根本没有使用服务中的房间。一,我不知道它是否会更快,二,如果我坚持活动并且只创建一次 ViewModel 和 ExecutorService ,它会使用更少的内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 2020-06-24
    • 2021-06-19
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    相关资源
    最近更新 更多