如何处理从RxJava到SQLite的不同方法调用

时间:2018-03-02 19:52:59

标签: android sqlite rx-java

我有一个Android应用程序,可以从SQLite数据库中添加和删除。我想知道以下的最佳做法。

在我的表中添加新行时,它可以采用两种不同的方式。 1)需要回调才能显示snackbar(主线程) 2)不需要回调(后台线程)

对于号码1的调用我在DBhelper中有方法返回一个可完成的,所以onSuccess我可以显示我的小吃吧。

对于编号为2的调用,它们应用于处理多个操作的Observable。

所以最好为这些调用编写两种不同的方法(如下所示)?或者从情景2的可观察性中调用我的完成表是否容易?

以下是我的SQLite帮助器类中的两个方法

 public Completable removeFavRX(Media media) {
        return Completable.create(subscriber -> {
            SQLiteDatabase db = this.getWritableDatabase();
            db.beginTransaction();
            try {
                db.delete(MainConstants.TBL_FAV, MEDIA_PATH + " = ?", new String[] { String.valueOf(media.getPath()) });
                db.setTransactionSuccessful();
            } catch (Exception e) {
                subscriber.onError(e);
            } finally {
                db.endTransaction();
                subscriber.onComplete();
            }
        });
    }

    public void removeFav(Media media) {
        SQLiteDatabase db = this.getWritableDatabase();
        db.beginTransaction();
        try {
            db.delete(MainConstants.TBL_FAV, MEDIA_PATH + " = ?", new String[] { String.valueOf(media.getPath()) });
            db.setTransactionSuccessful();
        } catch (Exception e) {
            e.printStackTrace();
            Crashlytics.logException(e);
        } finally {
            db.endTransaction();
        }
    }

1 个答案:

答案 0 :(得分:0)

避免code duplication几乎总是更好。这意味着您从存储库返回Completeable的解决方案将是更好的选择。

如果你担心这两个用例,其中一个需要在后台线程上同步执行而另一个用作回调,你总是可以使Completeable与{repository.removeFavRx(media) .blockingGet(); //be sure to catch an exception here if you need to 同步执行3}}。

在后台线程上同步执行的示例:

repository.removeFavRx(media)
    .subscribe( //...

回调示例

//function
float rounding(float roundedNumber)
{
   roundedNumber = roundedNumber * 100.0f + 0.5f;
   roundedNumber = (int) roundedNumber * 0.01f;

   return roundedNumber;
}