无法使用 RxJava Completable 在 Room 中添加数据
Unable to add data in Room using RxJava Completable
我正在使用 MVVM 架构模式制作一个应用我正在尝试使用 RxJava 在房间数据库中添加数据但是它在 lambda 表达式下显示红线说
Bad return type in lambda expression : void cannot be converted to Object.
下面是我的代码:
UserDao.java
@Dao
public interface UserDao {
@Insert
void insert(User user);
@Query("SELECT * FROM Users ORDER BY id DESC")
Flowable<List<User>> getAllUsers();
}
UserRepository.java
public class UserRepository {
private UserDb userDb;
private UserDao userDao;
private Flowable<List<User>> allUsers;
public UserRepository(Application application) {
userDb = UserDb.getInstance(application);
userDao = userDb.userDao();
allUsers = userDao.getAllUsers();
}
public void insert(final User user){
Completable.fromCallable(() -> userDb.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) {
}
});
}
}
有人请让我知道我做错了什么。任何帮助将不胜感激。
谢谢
而不是使用 Completable.fromCallable
,你应该使用 Completable.fromAction
,它不需要 lambda 来 return 东西。
插入完成或失败时祝酒:
public class UserRepository {
private UserDb userDb;
private UserDao userDao;
private Flowable<List<User>> allUsers;
public UserRepository(Application application) {
userDb = UserDb.getInstance(application);
userDao = userDb.userDao();
allUsers = userDao.getAllUsers();
}
public Completable insert(final User user){
return Completable.fromAction(() -> userDb.userDao().insert(user))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
}
在你的 activity 里面:
public void onInsertClicked(){
userRepository = //get your repository instance.
//remember to dispose this disposable when activity destroyed, otherwise the onComplete callback will leak reference to our activity.
Disposable disposable = userRepository.subscribe(() -> Toast.makeText(this, "Completed!", Toast.LENGTH_SHORT).show(),
throwable -> Toast.makeText(this, "Error!", Toast.LENGTH_SHORT).show());
}
如果您不想在 activity 中调用插入:
您还可以在存储库中保存对应用程序的引用
public class UserRepository {
private UserDb userDb;
private UserDao userDao;
private Flowable<List<User>> allUsers;
private final Context context;
public UserRepository(Application application) {
userDb = UserDb.getInstance(application);
userDao = userDb.userDao();
allUsers = userDao.getAllUsers();
context = application.getApplicationContext();
}
public void insert(final User user){
Completable.fromAction(() -> userDb.userDao().insert(user))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(() -> Toast.makeText(context, "Completed!", Toast.LENGTH_SHORT).show(),
throwable -> Toast.makeText(context, "Error!", Toast.LENGTH_SHORT).show());
}
}
我正在使用 MVVM 架构模式制作一个应用我正在尝试使用 RxJava 在房间数据库中添加数据但是它在 lambda 表达式下显示红线说
Bad return type in lambda expression : void cannot be converted to Object.
下面是我的代码:
UserDao.java
@Dao
public interface UserDao {
@Insert
void insert(User user);
@Query("SELECT * FROM Users ORDER BY id DESC")
Flowable<List<User>> getAllUsers();
}
UserRepository.java
public class UserRepository {
private UserDb userDb;
private UserDao userDao;
private Flowable<List<User>> allUsers;
public UserRepository(Application application) {
userDb = UserDb.getInstance(application);
userDao = userDb.userDao();
allUsers = userDao.getAllUsers();
}
public void insert(final User user){
Completable.fromCallable(() -> userDb.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) {
}
});
}
}
有人请让我知道我做错了什么。任何帮助将不胜感激。
谢谢
而不是使用 Completable.fromCallable
,你应该使用 Completable.fromAction
,它不需要 lambda 来 return 东西。
插入完成或失败时祝酒:
public class UserRepository {
private UserDb userDb;
private UserDao userDao;
private Flowable<List<User>> allUsers;
public UserRepository(Application application) {
userDb = UserDb.getInstance(application);
userDao = userDb.userDao();
allUsers = userDao.getAllUsers();
}
public Completable insert(final User user){
return Completable.fromAction(() -> userDb.userDao().insert(user))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
}
在你的 activity 里面:
public void onInsertClicked(){
userRepository = //get your repository instance.
//remember to dispose this disposable when activity destroyed, otherwise the onComplete callback will leak reference to our activity.
Disposable disposable = userRepository.subscribe(() -> Toast.makeText(this, "Completed!", Toast.LENGTH_SHORT).show(),
throwable -> Toast.makeText(this, "Error!", Toast.LENGTH_SHORT).show());
}
如果您不想在 activity 中调用插入:
您还可以在存储库中保存对应用程序的引用
public class UserRepository {
private UserDb userDb;
private UserDao userDao;
private Flowable<List<User>> allUsers;
private final Context context;
public UserRepository(Application application) {
userDb = UserDb.getInstance(application);
userDao = userDb.userDao();
allUsers = userDao.getAllUsers();
context = application.getApplicationContext();
}
public void insert(final User user){
Completable.fromAction(() -> userDb.userDao().insert(user))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(() -> Toast.makeText(context, "Completed!", Toast.LENGTH_SHORT).show(),
throwable -> Toast.makeText(context, "Error!", Toast.LENGTH_SHORT).show());
}
}