: Beginning Android

query()

query()

As one might expect, the query() method is where your content provider gets details on a query some activity wants to perform. It is up to you to actually process said query.

The query method gets the following as parameters:

A Uri representing the collection or instance being queried

A String[] representing the list of properties that should be returned

A String representing what amounts to a SQL WHERE clause, constraining which instances should be considered for the query results

A String[] representing values to pour into the WHERE clause, replacing any ? found there

A String representing what amounts to a SQL ORDER BY clause

You are responsible for interpreting these parameters however they make sense and returning a Cursor that can be used to iterate over and access the data.

As you can imagine, these parameters are aimed toward people using a SQLite database for storage. You are welcome to ignore some of these parameters (e.g., you can elect not to try to roll your own SQL WHERE-clause parser), but you need to document that fact so activities attempt to query you only by instance Uri and not using parameters you elect not to handle.

For SQLite-backed storage providers, however, the query() method implementation should be largely boilerplate. Use a SQLiteQueryBuilder to convert the various parameters into a single SQL statement, then use query() on the builder to actually invoke the query and give you a Cursor back. The Cursor is what your query() method then returns.

For example, here is query() from Provider:

@Override
public Cursorquery(Uri url, String[] projection, String selection,
String[] selectionArgs, String sort) {
SQLiteQueryBuilder qb =newSQLiteQueryBuilder();
qb.setTables(getTableName());
if (isCollectionUri(url)) {
qb.setProjectionMap(getDefaultProjection());
}else {
qb.appendWhere(getIdColumnName()+"="+url.getPathSegments().get(1));
}
String orderBy;
if (TextUtils.isEmpty(sort)) {
orderBy =getDefaultSortOrder();
}else {
orderBy = sort;
}
Cursor c = qb.query(db, projection, selection, selectionArgs,
null,null, orderBy);
c.setNotificationUri(getContext().getContentResolver(), url);
return c;
}

We create a SQLiteQueryBuilder and pour the query details into the builder. Note that the query could be based on either a collection or an instance Uri in the latter case, we need to add the instance ID to the query. When done, we use the query() method on the builder to get a Cursor for the results.


: 0.137. /Cache: 2 / 0