To perform a query, create the ​​CursorLoader​​, set up its query, and pass it to the loader framework. From then on, the framework manages everything. It runs the query on a background thread, returns the results to the foreground, and watches for changes to the data associated with the query.

Pass a ​​CursorLoader​​​ to the loader framework in your implementation of​​onCreateLoader()​​. The loader framework calls this method when youcreate a loader by calling ​​initLoader()​​​. You can create a​​CursorLoader​​​ anywhere, but the preferred way is to create it in​​onCreateLoader()​​, because this defers creation until the object is actually needed.

Notice that ​​initLoader()​​​ will only ​​onCreateLoader()​​​ if the​​CursorLoader​​​ doesn't already exist; otherwise, it re-uses the existing​​CursorLoader​​​. The loader framework tracks ​​CursorLoader​​​ instance using the​​id​​​ value passed to ​​initLoader()​​.

Define and Launch the Query

To create a ​​CursorLoader​​​ and define its query at the same time, call the constructor​​CursorLoader(context, uri, projection, selection, selectionArgs, sortOrder)​​​. The​​context​​​ and ​​uri​​​ arguments are required, but the others are optional. To use the default value for an optional argument, pass in​​null​​​. The ​​CursorLoader​​​ runs the query against the​​ContentProvider​​​ identified by ​​uri​​​, just as if you had called​​ContentResolver.query()​​ with the same arguments.

For example:


public Loader<Cursor> onCreateLoader(int loaderID, Bundle bundle) { /* * Takes action based on the ID of the Loader that's being created */ switch (loaderID) { case URL_LOADER: /* * Return a new CursorLoader */ return new CursorLoader( this, // Context DataProviderContract.IMAGE_URI, // Provider's content URI PROJECTION, // Columns to return null, // Return all rows null, // No search arguments null); // Default search order default: // An invalid id was passed in return null; } }