我有一个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();
}
}
答案 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;
}