使用 RxJava (Room) 获取插入 ID

Getting insert id with RxJava (Room)

我可以使用 RxJava 添加一行,

Completable.fromAction(() -> db.userDao().insert(user)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new CompletableObserver() {
            @Override
            public void onSubscribe(Disposable d) {

            }

            @Override
            public void onComplete() {

            }

            @Override
            public void onError(Throwable e) {

            }
        });

道:

@Insert(onConflict = OnConflictStrategy.REPLACE)
    long insert(User user);

如何获取DB操作后的row id?

如果你想在 Room 中使用 RxJava,你可以将 insert 函数更改为 return RxJava Single wrapping a Long,例如:

@Insert
Single<Long> insert(User user);

这样你就可以订阅这个 Single 然后你会得到像这样的 id:

db.userDao().insert(user)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new SingleObserver<Long>() {
            @Override
            public void onSubscribe(Disposable d) {
            }
            @Override
            public void onSuccess(Long aLong) {
                // aLong is the id
            }
            @Override
            public void onError(Throwable e) {
            }
        });