package com.simplecity.amp_library.sql.sqlbrite; import android.content.Context; import android.database.Cursor; import android.util.Log; import com.simplecity.amp_library.model.Query; import com.squareup.sqlbrite.BriteContentResolver; import com.squareup.sqlbrite.SqlBrite; import java.util.List; import rx.Observable; import rx.Single; import rx.functions.Func1; import rx.schedulers.Schedulers; public final class SqlBriteUtils { private SqlBriteUtils() { } private static final String TAG = "SqlBriteUtils"; private static BriteContentResolver wrapContentProvider(Context context) { final SqlBrite sqlBrite = SqlBrite.create(); BriteContentResolver briteContentResolver = sqlBrite.wrapContentProvider(context.getContentResolver(), Schedulers.io()); // briteContentResolver.setLoggingEnabled(BuildConfig.DEBUG); return briteContentResolver; } public static Observable<SqlBrite.Query> createContinuousQuery(Context context, Query query) { return wrapContentProvider(context) .createQuery(query.uri, query.projection, query.selection, query.args, query.sort, false) .subscribeOn(Schedulers.io()) .doOnError(error -> Log.e(TAG, "Query failed.\nError:" + error.toString() + "\nQuery: " + query.toString())); } /** * Creates an {@link Observable} that <b>continuously</b> emits new Lists when subscribed and when the content provider notifies of a change. */ public static <T> Observable<List<T>> createContinuousQuery(Context context, Func1<Cursor, T> mapper, Query query) { return createContinuousQuery(context, query) .lift(new QueryToListOperator<>(mapper)); } /** * Creates a {@link Observable} that emits a List. */ public static <T> Observable<List<T>> createQuery(Context context, Func1<Cursor, T> mapper, Query query) { return createContinuousQuery(context, mapper, query).first(); } /** * Creates an {@link Observable} that <b>continuously</b> emits a single item when subscribed and when the content provider notifies of a change. * <p> * Note: No default item is emitted. If the cursor is empty, downstream subscribers will not * receive a result. */ public static <T> Observable<T> createSingleContinuousQuery(Context context, Func1<Cursor, T> mapper, Query query) { return createSingleContinuousQuery(context, mapper, null, query); } /** * Creates a {@link Observable} that emits a single item. */ public static <T> Observable<T> createSingleQuery(Context context, Func1<Cursor, T> mapper, Query query) { return createSingleContinuousQuery(context, mapper, null, query).first(); } /** * Creates an {@link Observable} that <b>continuously</b> emits a single item when subscribed and when the content provider notifies of a change. * <p> * Note: If no default item is supplied, nothing is emitted. Downstream subscribers will not receive a result. * * @param defaultValue the default value to emit (or null if no default value should be emitted) */ public static <T> Observable<T> createSingleContinuousQuery(Context context, Func1<Cursor, T> mapper, T defaultValue, Query query) { return wrapContentProvider(context) .createQuery(query.uri, query.projection, query.selection, query.args, query.sort, false) .lift(new QueryToOneOperator<>(mapper, defaultValue != null, defaultValue)); } /** * Creates a {@link Single} that emits a single item. * <p> * Note: If no default item is supplied, nothing is emitted. Downstream subscribers will not receive a result. */ public static <T> Observable<T> createSingleQuery(Context context, Func1<Cursor, T> mapper, T defaultValue, Query query) { return createSingleContinuousQuery(context, mapper, defaultValue, query).first(); } }