我有一个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();
}
}
避免使用code duplication几乎总是更好。这将意味着您从存储库返回Completeable
的解决方案将是更好的选择。
如果您担心这两个用例,其中一个需要在后台线程上同步执行而另一个用作回调,则总是可以使Completeable
与Completable#blockingGet()
同步执行。
在后台线程上同步执行的示例:
repository.removeFavRx(media)
.blockingGet(); //be sure to catch an exception here if you need to
回调示例
repository.removeFavRx(media)
.subscribe( //...