将房间的@insert插入RxJava2

时间:2018-08-22 10:57:42

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

我正在尝试将RxJava2与Room Persistence库一起使用,并且它对于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() {

                }
            });
}
}

2 个答案:

答案 0 :(得分:0)

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

@Insert
long insert(Word word);

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

答案 1 :(得分:0)

其中一种方法是

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

在Rxjava中是

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

插入应始终返回long []或Long []。您无法将其包裹在可观察的范围内。但是您仍然可以将其包装为可调用的,可观察的或可流动的。