Search in sources :

Example 1 with QueryObservable

use of com.squareup.sqlbrite3.QueryObservable in project sqlbrite by square.

the class QueryObservableTest method mapToListThrowsFromQueryRun.

@Test
public void mapToListThrowsFromQueryRun() {
    final IllegalStateException error = new IllegalStateException("test exception");
    Query query = new Query() {

        @Override
        public Cursor run() {
            throw error;
        }
    };
    // 
    new QueryObservable(Observable.just(query)).mapToList(new Function<Cursor, Object>() {

        @Override
        public Object apply(Cursor cursor) {
            throw new AssertionError("Must not be called");
        }
    }).test().assertNoValues().assertError(error);
}
Also used : Function(io.reactivex.functions.Function) Query(com.squareup.sqlbrite3.SqlBrite.Query) QueryObservable(com.squareup.sqlbrite3.QueryObservable) MatrixCursor(android.database.MatrixCursor) Cursor(android.database.Cursor) Test(org.junit.Test)

Example 2 with QueryObservable

use of com.squareup.sqlbrite3.QueryObservable in project sqlbrite by square.

the class BriteContentResolver method createQuery.

/**
 * Create an observable which will notify subscribers with a {@linkplain Query query} for
 * execution. Subscribers are responsible for <b>always</b> closing {@link Cursor} instance
 * returned from the {@link Query}.
 * <p>
 * Subscribers will receive an immediate notification for initial data as well as subsequent
 * notifications for when the supplied {@code uri}'s data changes. Unsubscribe when you no longer
 * want updates to a query.
 * <p>
 * Since content resolver triggers are inherently asynchronous, items emitted from the returned
 * observable use the {@link Scheduler} supplied to {@link SqlBrite#wrapContentProvider}. For
 * consistency, the immediate notification sent on subscribe also uses this scheduler. As such,
 * calling {@link Observable#subscribeOn subscribeOn} on the returned observable has no effect.
 * <p>
 * Note: To skip the immediate notification and only receive subsequent notifications when data
 * has changed call {@code skip(1)} on the returned observable.
 * <p>
 * <b>Warning:</b> this method does not perform the query! Only by subscribing to the returned
 * {@link Observable} will the operation occur.
 *
 * @see ContentResolver#query(Uri, String[], String, String[], String)
 * @see ContentResolver#registerContentObserver(Uri, boolean, ContentObserver)
 */
@CheckResult
@NonNull
public QueryObservable createQuery(@NonNull final Uri uri, @Nullable final String[] projection, @Nullable final String selection, @Nullable final String[] selectionArgs, @Nullable final String sortOrder, final boolean notifyForDescendents) {
    final Query query = new Query() {

        @Override
        public Cursor run() {
            long startNanos = nanoTime();
            Cursor cursor = contentResolver.query(uri, projection, selection, selectionArgs, sortOrder);
            if (logging) {
                long tookMillis = NANOSECONDS.toMillis(nanoTime() - startNanos);
                log("QUERY (%sms)\n  uri: %s\n  projection: %s\n  selection: %s\n  selectionArgs: %s\n  " + "sortOrder: %s\n  notifyForDescendents: %s", tookMillis, uri, Arrays.toString(projection), selection, Arrays.toString(selectionArgs), sortOrder, notifyForDescendents);
            }
            return cursor;
        }
    };
    Observable<Query> queries = Observable.create(new ObservableOnSubscribe<Query>() {

        @Override
        public void subscribe(final ObservableEmitter<Query> e) throws Exception {
            final ContentObserver observer = new ContentObserver(contentObserverHandler) {

                @Override
                public void onChange(boolean selfChange) {
                    if (!e.isDisposed()) {
                        e.onNext(query);
                    }
                }
            };
            contentResolver.registerContentObserver(uri, notifyForDescendents, observer);
            e.setCancellable(new Cancellable() {

                @Override
                public void cancel() throws Exception {
                    contentResolver.unregisterContentObserver(observer);
                }
            });
            if (!e.isDisposed()) {
                // Trigger initial query.
                e.onNext(query);
            }
        }
    });
    return // 
    queries.observeOn(// 
    scheduler).compose(// Apply the user's query transformer.
    queryTransformer).to(QUERY_OBSERVABLE);
}
Also used : Query(com.squareup.sqlbrite3.SqlBrite.Query) Cancellable(io.reactivex.functions.Cancellable) Cursor(android.database.Cursor) ContentObserver(android.database.ContentObserver) CheckResult(android.support.annotation.CheckResult) NonNull(android.support.annotation.NonNull)

Example 3 with QueryObservable

use of com.squareup.sqlbrite3.QueryObservable in project sqlbrite by square.

the class QueryObservableTest method mapToListThrowsFromMapFunction.

@Test
public void mapToListThrowsFromMapFunction() {
    Query query = new Query() {

        @Override
        public Cursor run() {
            MatrixCursor cursor = new MatrixCursor(new String[] { "col1" });
            cursor.addRow(new Object[] { "value1" });
            return cursor;
        }
    };
    final IllegalStateException error = new IllegalStateException("test exception");
    // 
    new QueryObservable(Observable.just(query)).mapToList(new Function<Cursor, Object>() {

        @Override
        public Object apply(Cursor cursor) {
            throw error;
        }
    }).test().assertNoValues().assertError(error);
}
Also used : Function(io.reactivex.functions.Function) Query(com.squareup.sqlbrite3.SqlBrite.Query) QueryObservable(com.squareup.sqlbrite3.QueryObservable) MatrixCursor(android.database.MatrixCursor) Cursor(android.database.Cursor) MatrixCursor(android.database.MatrixCursor) Test(org.junit.Test)

Aggregations

Cursor (android.database.Cursor)3 Query (com.squareup.sqlbrite3.SqlBrite.Query)3 MatrixCursor (android.database.MatrixCursor)2 QueryObservable (com.squareup.sqlbrite3.QueryObservable)2 Function (io.reactivex.functions.Function)2 Test (org.junit.Test)2 ContentObserver (android.database.ContentObserver)1 CheckResult (android.support.annotation.CheckResult)1 NonNull (android.support.annotation.NonNull)1 Cancellable (io.reactivex.functions.Cancellable)1