【问题标题】:Wrapping Room's @insert into RxJava2将 Room 的 @insert 包装到 RxJava2 中
【发布时间】:2018-08-22 10:57:41
【问题描述】:

我正在尝试将 RxJava2 与 Room 持久性库一起使用,它对于 DAO 文件中的 @Query 注释运行良好,但对于 @Insert 它说它不会从 RxJava2 返回任何内容,所以我如何将它包装在 Observable 中以使用使用 RxJava2。

DAO 文件

@Dao
public interface WordDao {
@Insert
void insert(Word word);

@Query("delete from word_table")
void deleteAll();
@Query("select * from word_table order by word_id asc limit 1")
Maybe<Word> getTheIndexOfTopWord();
}

我从中调用这些函数的存储库文件,

public class Repository {

private WordDao wordDao;
private WordRoomDatabase db;

private LiveData<List<Word>> allWords;

public Repository(Application application) {
    db = WordRoomDatabase.getDatabase(application);
    wordDao = db.wordDao();
    allWords = wordDao.getAllWords();
}

public LiveData<List<Word>> getAllWords() {
    return allWords;
}

public void insertWord(Word word) {
//here I can't subscribe due to the return type-----------------------
    db.wordDao().insert(word).subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new MaybeObserver<Void>() {
                @Override
                public void onSubscribe(Disposable d) {

                }

                @Override
                public void onSuccess(Void aVoid) {
                    //
                }

                @Override
                public void onError(Throwable e) {
                    e.printStackTrace();
                }

                @Override
                public void onComplete() {

                }
            });
}
}

【问题讨论】:

  • 使用Completable
  • 是的,成功了!谢谢!

标签: android rx-java repository-pattern rx-java2 android-room


【解决方案1】:

如下定义您的insert() 方法。

@Insert
long insert(Word word);

返回的long 值是您的Word 实体的ID。 (您可以返回与您的 Word 实体 ID 匹配的任何数据类型)

【讨论】:

    【解决方案2】:

    其中一种方法是

    @Dao
    public interface SomeDao{
     @Insert
     long[] insert(Word word);
    }
    

    在 Rxjava 中是

    Single.fromCallable(() -> yourDataBase.someDao().insert(word)).subscribeOn(Schedulers.io()).subscribe();
    

    Insert 应始终返回 long[] 或 Long[]。你不能把它包装在 observable 中。但是您仍然可以将其包装在单个、可观察或可流动的可调用对象中。

    【讨论】:

    • 视需求而定
    • 正确的方式取决于用例。如果您不担心数据是否插入到数据库中,您可以选择 Completable,否则如果我从它返回很长,我将需要 Single。 @LordRaydenMK
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-13
    • 2010-11-07
    相关资源
    最近更新 更多