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

问题描述 投票:0回答:1

我有一个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();
        }
    }
android sqlite rx-java
1个回答
0
投票

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

如果您担心这两个用例,其中一个需要在后台线程上同步执行而另一个用作回调,则总是可以使CompleteableCompletable#blockingGet()同步执行。

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

repository.removeFavRx(media)
    .blockingGet(); //be sure to catch an exception here if you need to

回调示例

repository.removeFavRx(media)
    .subscribe( //...
© www.soinside.com 2019 - 2024. All rights reserved.