package com.raizlabs.android.dbflow.rx.structure;
import android.support.annotation.NonNull;
import com.raizlabs.android.dbflow.annotation.ColumnIgnore;
import com.raizlabs.android.dbflow.config.FlowManager;
import com.raizlabs.android.dbflow.structure.BaseModel;
import com.raizlabs.android.dbflow.structure.InvalidDBConfiguration;
import com.raizlabs.android.dbflow.structure.ModelAdapter;
import com.raizlabs.android.dbflow.structure.database.DatabaseWrapper;
import rx.Completable;
import rx.Single;
/**
* Description: Similar to {@link BaseModel} with RX constructs. Extend this for convenience methods.
*/
@SuppressWarnings("unchecked")
public class BaseRXModel {
@ColumnIgnore
private transient RXModelAdapter modelAdapter;
@NonNull
public Single<Boolean> save() {
return getRXModelAdapter().save(this);
}
@NonNull
public Single<Boolean> save(DatabaseWrapper databaseWrapper) {
return getRXModelAdapter().save(this, databaseWrapper);
}
@NonNull
public Completable load() {
return getRXModelAdapter().load(this);
}
@NonNull
public Completable load(DatabaseWrapper databaseWrapper) {
return getRXModelAdapter().load(this, databaseWrapper);
}
@NonNull
public Single<Boolean> delete() {
return getRXModelAdapter().delete(this);
}
@NonNull
public Single<Boolean> delete(DatabaseWrapper databaseWrapper) {
return getRXModelAdapter().delete(this, databaseWrapper);
}
@NonNull
public Single<Boolean> update() {
return getRXModelAdapter().update(this);
}
@NonNull
public Single<Boolean> update(DatabaseWrapper databaseWrapper) {
return getRXModelAdapter().update(this, databaseWrapper);
}
@NonNull
public Single<Long> insert() {
return getRXModelAdapter().insert(this);
}
@NonNull
public Single<Long> insert(DatabaseWrapper databaseWrapper) {
return getRXModelAdapter().insert(this, databaseWrapper);
}
@NonNull
public Single<Boolean> exists() {
return getRXModelAdapter().exists(this);
}
@NonNull
public Single<Boolean> exists(DatabaseWrapper databaseWrapper) {
return getRXModelAdapter().exists(this, databaseWrapper);
}
/**
* @return The associated {@link ModelAdapter}. The {@link FlowManager}
* may throw a {@link InvalidDBConfiguration} for this call if this class
* is not associated with a table, so be careful when using this method.
*/
@NonNull
private RXModelAdapter getRXModelAdapter() {
if (modelAdapter == null) {
modelAdapter = new RXModelAdapter<>(getClass());
}
return modelAdapter;
}
}