page.title=Retrieving a List of Contacts

trainingnavtop=true
@jd:body

<div id="tb-wrapper">
<div id="tb">

<!-- table of contents -->
<h2>This lesson teaches you to</h2>
<ol>
  <li><a href="#Permissions">Request Permission to Read the Provider</a>
  <li><a href="#NameMatch">Match a Contact by Name and List the Results</a></li>
  <li><a href="#TypeMatch">Match a Contact By a Specific Type of Data</a></li>
  <li><a href="#GeneralMatch">Match a Contact By Any Type of Data</a></li>
</ol>

<!-- other docs (NOT javadocs) -->
<h2>You should also read</h2>
<ul>
    <li>
        <a href="{@docRoot}guide/topics/providers/content-provider-basics.html">
        Content Provider Basics</a>
    </li>
    <li>
        <a href="{@docRoot}guide/topics/providers/contacts-provider.html">
        Contacts Provider</a>
    </li>
    <li>
        <a href="{@docRoot}guide/components/loaders.html">Loaders</a>
    </li>
    <li>
        <a href="{@docRoot}guide/topics/search/search-dialog.html">Creating a Search Interface</a>
    </li>
</ul>

<h2>Try it out</h2>

<div class="download-box">
    <a href="http://developer.android.com/shareables/training/ContactsList.zip" class="button">
    Download the sample
    </a>
 <p class="filename">ContactsList.zip</p>
</div>

</div>
</div>
<p>
    This lesson shows you how to retrieve a list of contacts whose data matches all or part of a
    search string, using the following techniques:
</p>
<dl>
    <dt>Match contact names</dt>
    <dd>
        Retrieve a list of contacts by matching the search string to all or part of the contact
        name data. The Contacts Provider allows multiple instances of the same name, so this
        technique can return a list of matches.
    </dd>
    <dt>Match a specific type of data, such as a phone number</dt>
    <dd>
        Retrieve a list of contacts by matching the search string to a particular type of detail
        data such as an email address. For example, this technique allows you to list all of the
        contacts whose email address matches the search string.
    </dd>
    <dt>Match any type of data</dt>
    <dd>
        Retrieve a list of contacts by matching the search string to any type of detail data,
        including name, phone number, street address, email address, and so forth. For example,
        this technique allows you to accept any type of data for a search string and then list the
        contacts for which the data matches the string.
    </dd>
</dl>
<p class="note">
    <strong>Note:</strong> All the examples in this lesson use a
    {@link android.support.v4.content.CursorLoader} to retrieve data from the Contacts
    Provider. A {@link android.support.v4.content.CursorLoader} runs its query on a
    thread that's separate from the UI thread. This ensures that the query doesn't slow down UI
    response times and cause a poor user experience. For more information, see the Android
    training class <a href="{@docRoot}training/load-data-background/index.html">
    Loading Data in the Background</a>.
</p>
<h2 id="Permissions">Request Permission to Read the Provider</h2>
<p>
    To do any type of search of the Contacts Provider, your app must have
    {@link android.Manifest.permission#READ_CONTACTS READ_CONTACTS} permission.
    To request this, add this
<code><a href="{@docRoot}guide/topics/manifest/uses-permission-element.html">&lt;uses-permission&gt;</a></code>
    element to your manifest file as a child element of
<code><a href="{@docRoot}guide/topics/manifest/manifest-element.html">&lt;manifest&gt;</a></code>:
</p>
<pre>
    &lt;uses-permission android:name="android.permission.READ_CONTACTS" /&gt;
</pre>
<h2 id="NameMatch">Match a Contact by Name and List the Results</h2>
<p>
    This technique tries to match a search string to the name of a contact or contacts in the
    Contact Provider's {@link android.provider.ContactsContract.Contacts} table. You usually want
    to display the results in a {@link android.widget.ListView}, to allow the user to choose among
    the matched contacts.
</p>
<h3 id="DefineListView">Define ListView and item layouts</h3>
<p>
    To display the search results in a {@link android.widget.ListView}, you need a main layout file
    that defines the entire UI including the {@link android.widget.ListView}, and an item layout
    file that defines one line of the {@link android.widget.ListView}. For example, you could create
    the main layout file <code>res/layout/contacts_list_view.xml</code> with
    the following XML:
</p>
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;ListView xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="&#64;android:id/list"
          android:layout_width="match_parent"
          android:layout_height="match_parent"/&gt;
</pre>
<p>
    This XML uses the built-in Android {@link android.widget.ListView} widget
    {@link android.R.id#list android:id/list}.
</p>
<p>
    Define the item layout file <code>contacts_list_item.xml</code> with the following XML:
</p>
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;TextView xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="&#64;android:id/text1"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:clickable="true"/&gt;
</pre>
<p>
    This XML uses the built-in Android {@link android.widget.TextView} widget
    {@link android.R.id#text1 android:text1}.
</p>
<p class="note">
    <strong>Note:</strong> This lesson doesn't describe the UI for getting a search string from the
    user, because you may want to get the string indirectly. For example, you can give the user
    an option to search for contacts whose name matches a string in an incoming text message.
</p>
<p>
    The two layout files you've written define a user interface that shows a
    {@link android.widget.ListView}. The next step is to write code that uses this UI to display a
    list of contacts.
</p>
<h3 id="Fragment">Define a Fragment that displays the list of contacts</h3>
<p>
    To display the list of contacts, start by defining a {@link android.support.v4.app.Fragment}
    that's loaded by an {@link android.app.Activity}. Using a
    {@link android.support.v4.app.Fragment} is a more flexible technique, because you can use
    one {@link android.support.v4.app.Fragment} to display the list and a second
    {@link android.support.v4.app.Fragment} to display the details for a contact that the user
    chooses from the list. Using this approach, you can combine one of the techniques presented in
    this lesson with one from the lesson <a href="retrieve-details.html">
    Retrieving Details for a Contact</a>.
</p>
<p>
    To learn how to use one or more {@link android.support.v4.app.Fragment} objects from an
    an {@link android.app.Activity}, read the training class
    <a href="{@docRoot}training/basics/fragments/index.html">
    Building a Dynamic UI with Fragments</a>.
</p>
<p>
    To help you write queries against the Contacts Provider, the Android framework provides a
    contracts class called {@link android.provider.ContactsContract}, which defines useful
    constants and methods for accessing the provider. When you use this class, you don't have to
    define your own constants for content URIs, table names, or columns. To use this class,
    include the following statement:
</p>
<pre>
import android.provider.ContactsContract;
</pre>
<p>
    Since the code uses a {@link android.support.v4.content.CursorLoader} to retrieve data
    from the provider, you must specify that it implements the loader interface
    {@link android.support.v4.app.LoaderManager.LoaderCallbacks}. Also, to help detect which contact
    the user selects from the list of search results, implement the adapter interface
    {@link android.widget.AdapterView.OnItemClickListener}. For example:
</p>
<pre>
...
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.widget.AdapterView;
...
public class ContactsFragment extends Fragment implements
        LoaderManager.LoaderCallbacks&lt;Cursor&gt;,
        AdapterView.OnItemClickListener {
</pre>
<h3 id="DefineVariables">Define global variables</h3>
<p>
    Define global variables that are used in other parts of the code:
</p>
<pre>
    ...
    /*
     * Defines an array that contains column names to move from
     * the Cursor to the ListView.
     */
    &#64;SuppressLint("InlinedApi")
    private final static String[] FROM_COLUMNS = {
            Build.VERSION.SDK_INT
                    &gt;= Build.VERSION_CODES.HONEYCOMB ?
                    Contacts.DISPLAY_NAME_PRIMARY :
                    Contacts.DISPLAY_NAME
    };
    /*
     * Defines an array that contains resource ids for the layout views
     * that get the Cursor column contents. The id is pre-defined in
     * the Android framework, so it is prefaced with "android.R.id"
     */
    private final static int[] TO_IDS = {
           android.R.id.text1
    };
    // Define global mutable variables
    // Define a ListView object
    ListView mContactsList;
    // Define variables for the contact the user selects
    // The contact's _ID value
    long mContactId;
    // The contact's LOOKUP_KEY
    String mContactKey;
    // A content URI for the selected contact
    Uri mContactUri;
    // An adapter that binds the result Cursor to the ListView
    private SimpleCursorAdapter mCursorAdapter;
    ...
</pre>
<p class="note">
    <strong>Note:</strong> Since
    {@link android.provider.ContactsContract.Contacts#DISPLAY_NAME_PRIMARY
    Contacts.DISPLAY_NAME_PRIMARY} requires Android 3.0 (API version 11) or later, setting your
    app's <code>minSdkVersion</code> to 10 or below generates an Android Lint warning in
    Android Studio. To turn off this warning, add the annotation
    <code>@SuppressLint("InlinedApi")</code> before the definition of <code>FROM_COLUMNS</code>.
</p>
<h3 id="InitializeFragment">Initialize the Fragment</h3>
<p>

    Initialize the {@link android.support.v4.app.Fragment}. Add the empty, public constructor
    required by the Android system, and inflate the {@link android.support.v4.app.Fragment} object's
    UI in the callback method {@link android.support.v4.app.Fragment#onCreateView onCreateView()}.
    For example:
</p>
<pre>
    // Empty public constructor, required by the system
    public ContactsFragment() {}

    // A UI Fragment must inflate its View
    &#64;Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // Inflate the fragment layout
        return inflater.inflate(R.layout.contact_list_fragment,
            container, false);
    }
</pre>
<h3 id="DefineAdapter">Set up the CursorAdapter for the ListView</h3>
<p>
    Set up the {@link android.support.v4.widget.SimpleCursorAdapter} that binds the results of the
    search to the {@link android.widget.ListView}. To get the {@link android.widget.ListView} object
    that displays the contacts, you need to call {@link android.app.Activity#findViewById
    Activity.findViewById()} using the parent activity of the
    {@link android.support.v4.app.Fragment}. Use the {@link android.content.Context} of the
    parent activity when you call {@link android.widget.ListView#setAdapter setAdapter()}.
    For example:
</p>
<pre>
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        ...
        // Gets the ListView from the View list of the parent activity
        mContactsList =
            (ListView) getActivity().findViewById(R.layout.contact_list_view);
        // Gets a CursorAdapter
        mCursorAdapter = new SimpleCursorAdapter(
                getActivity(),
                R.layout.contact_list_item,
                null,
                FROM_COLUMNS, TO_IDS,
                0);
        // Sets the adapter for the ListView
        mContactsList.setAdapter(mCursorAdapter);
    }
</pre>
<h3 id="SetListener">Set the selected contact listener</h3>
<p>
    When you display the results of a search, you usually want to allow the user to select a
    single contact for further processing. For example, when the user clicks a contact you can
    display the contact's address on a map. To provide this feature, you first defined the current
    {@link android.support.v4.app.Fragment} as the click listener by specifying that the class
    implements {@link android.widget.AdapterView.OnItemClickListener}, as shown in the section
    <a href="#Fragment">Define a Fragment that displays the list of contacts</a>.
</p>
<p>
    To continue setting up the listener, bind it to the {@link android.widget.ListView} by
    calling the method {@link android.widget.ListView#setOnItemClickListener
    setOnItemClickListener()} in {@link android.support.v4.app.Fragment#onActivityCreated
    onActivityCreated()}. For example:
</p>
<pre>
    public void onActivityCreated(Bundle savedInstanceState) {
        ...
        // Set the item click listener to be the current fragment.
        mContactsList.setOnItemClickListener(this);
        ...
    }
</pre>
<p>
    Since you specified that the current {@link android.support.v4.app.Fragment} is the
    {@link android.widget.AdapterView.OnItemClickListener OnItemClickListener} for the
    {@link android.widget.ListView}, you now need to implement its required method
    {@link android.widget.AdapterView.OnItemClickListener#onItemClick onItemClick()}, which
    handles the click event. This is described in a succeeding section.
</p>
<h3 id="DefineProjection">Define a projection</h3>
<p>
    Define a constant that contains the columns you want to return from your query. Each item in
    the {@link android.widget.ListView} displays the contact's display name,
    which contains the main form of the contact's name. In Android 3.0 (API version 11) and later,
    the name of this column is
    {@link android.provider.ContactsContract.Contacts#DISPLAY_NAME_PRIMARY
    Contacts.DISPLAY_NAME_PRIMARY}; in versions previous to that, its name is
    {@link android.provider.ContactsContract.Contacts#DISPLAY_NAME Contacts.DISPLAY_NAME}.
</p>
<p>
    The column {@link android.provider.ContactsContract.Contacts#_ID Contacts._ID} is used by the
    {@link android.support.v4.widget.SimpleCursorAdapter} binding process.
    {@link android.provider.ContactsContract.Contacts#_ID Contacts._ID} and
    {@link android.provider.ContactsContract.Contacts#LOOKUP_KEY} are used together to
    construct a content URI for the contact the user selects.
</p>
<pre>
...
&#64;SuppressLint("InlinedApi")
private static final String[] PROJECTION =
        {
            Contacts._ID,
            Contacts.LOOKUP_KEY,
            Build.VERSION.SDK_INT
                    &gt;= Build.VERSION_CODES.HONEYCOMB ?
                    Contacts.DISPLAY_NAME_PRIMARY :
                    Contacts.DISPLAY_NAME

        };
</pre>
<h3 id="DefineConstants">Define constants for the Cursor column indexes</h3>
<p>
    To get data from an individual column in a {@link android.database.Cursor}, you need
    the column's index within the {@link android.database.Cursor}. You can define constants
    for the indexes of the {@link android.database.Cursor} columns, because the indexes are
    the same as the order of the column names in your projection. For example:
</p>
<pre>
// The column index for the _ID column
private static final int CONTACT_ID_INDEX = 0;
// The column index for the LOOKUP_KEY column
private static final int LOOKUP_KEY_INDEX = 1;
</pre>
<h3 id="SelectionCriteria">Specify the selection criteria</h3>
<p>
    To specify the data you want, create a combination of text expressions and variables
    that tell the provider the data columns to search and the values to find.
</p>
<p>
    For the text expression, define a constant that lists the search columns. Although this
    expression can contain values as well, the preferred practice is to represent the values with
    a "?" placeholder. During retrieval, the placeholder is replaced with values from an
    array. Using "?" as a placeholder ensures that the search specification is generated by binding
    rather than by SQL compilation. This practice eliminates the possibility of malicious SQL
    injection. For example:
</p>
<pre>
    // Defines the text expression
    &#64;SuppressLint("InlinedApi")
    private static final String SELECTION =
            Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.HONEYCOMB ?
            Contacts.DISPLAY_NAME_PRIMARY + " LIKE ?" :
            Contacts.DISPLAY_NAME + " LIKE ?";
    // Defines a variable for the search string
    private String mSearchString;
    // Defines the array to hold values that replace the ?
    private String[] mSelectionArgs = { mSearchString };
</pre>
<h3 id="OnItemClick">Define the onItemClick() method</h3>
<p>
    In a previous section, you set the item click listener for the {@link android.widget.ListView}.
    Now implement the action for the listener by defining the method
    {@link android.widget.AdapterView.OnItemClickListener#onItemClick
    AdapterView.OnItemClickListener.onItemClick()}:
</p>
<pre>
    &#64;Override
    public void onItemClick(
        AdapterView&lt;?&gt; parent, View item, int position, long rowID) {
        // Get the Cursor
        Cursor cursor = parent.getAdapter().getCursor();
        // Move to the selected contact
        cursor.moveToPosition(position);
        // Get the _ID value
        mContactId = getLong(CONTACT_ID_INDEX);
        // Get the selected LOOKUP KEY
        mContactKey = getString(CONTACT_KEY_INDEX);
        // Create the contact's content Uri
        mContactUri = Contacts.getLookupUri(mContactId, mContactKey);
        /*
         * You can use mContactUri as the content URI for retrieving
         * the details for a contact.
         */
    }
</pre>
<h3 id="InitializeLoader">Initialize the loader</h3>
<p>
    Since you're using a {@link android.support.v4.content.CursorLoader} to retrieve data,
    you must initialize the background thread and other variables that control asynchronous
    retrieval. Do the initialization in
    {@link android.support.v4.app.Fragment#onActivityCreated onActivityCreated()}, which
    is invoked immediately before the {@link android.support.v4.app.Fragment} UI appears, as
    shown in the following example:
</p>
<pre>
public class ContactsFragment extends Fragment implements
        LoaderManager.LoaderCallbacks&lt;Cursor&gt; {
    ...
    // Called just before the Fragment displays its UI
    &#64;Override
    public void onActivityCreated(Bundle savedInstanceState) {
        // Always call the super method first
        super.onActivityCreated(savedInstanceState);
        ...
        // Initializes the loader
        getLoaderManager().initLoader(0, null, this);
</pre>
<h3 id="OnCreateLoader">Implement onCreateLoader()</h3>
<p>
    Implement the method
    {@link android.support.v4.app.LoaderManager.LoaderCallbacks#onCreateLoader onCreateLoader()},
    which is called by the loader framework immediately after you call
    {@link android.support.v4.app.LoaderManager#initLoader initLoader()}.
<p>
    In {@link android.support.v4.app.LoaderManager.LoaderCallbacks#onCreateLoader onCreateLoader()},
    set up the search string pattern. To make a string into a pattern, insert "%"
    (percent) characters to represent a sequence of zero or more characters, or "_" (underscore)
    characters to represent a single character, or both. For example, the pattern "%Jefferson%"
    would match both "Thomas Jefferson" and "Jefferson Davis".
</p>
<p>
    Return a new {@link android.support.v4.content.CursorLoader} from the method. For the content
    URI, use {@link android.provider.ContactsContract.Contacts#CONTENT_URI Contacts.CONTENT_URI}.
    This URI refers to the entire table, as shown in the following example:
</p>
<pre>
    ...
    &#64;Override
    public Loader&lt;Cursor&gt; onCreateLoader(int loaderId, Bundle args) {
        /*
         * Makes search string into pattern and
         * stores it in the selection array
         */
        mSelectionArgs[0] = "%" + mSearchString + "%";
        // Starts the query
        return new CursorLoader(
                getActivity(),
                Contacts.CONTENT_URI,
                PROJECTION,
                SELECTION,
                mSelectionArgs,
                null
        );
    }
</pre>
<h3 id="FinishedReset">Implement onLoadFinished() and onLoaderReset()</h3>
<p>
    Implement the
    {@link android.support.v4.app.LoaderManager.LoaderCallbacks#onLoadFinished onLoadFinished()}
    method. The loader framework calls
    {@link android.support.v4.app.LoaderManager.LoaderCallbacks#onLoadFinished onLoadFinished()}
    when the Contacts Provider returns the results of the query. In this method, put the
    result {@link android.database.Cursor} in the
    {@link android.support.v4.widget.SimpleCursorAdapter}. This automatically updates the
    {@link android.widget.ListView} with the search results:
</p>
<pre>
    public void onLoadFinished(Loader&lt;Cursor&gt; loader, Cursor cursor) {
        // Put the result Cursor in the adapter for the ListView
        mCursorAdapter.swapCursor(cursor);
    }
</pre>
<p>
    The method {@link android.support.v4.app.LoaderManager.LoaderCallbacks#onLoaderReset
    onLoaderReset()} is invoked when the loader framework detects that the
    result {@link android.database.Cursor} contains stale data. Delete the
    {@link android.support.v4.widget.SimpleCursorAdapter} reference to the existing
    {@link android.database.Cursor}. If you don't, the loader framework will not
    recycle the {@link android.database.Cursor}, which causes a memory leak. For example:
</p>
<pre>
    &#64;Override
    public void onLoaderReset(Loader&lt;Cursor&gt; loader) {
        // Delete the reference to the existing Cursor
        mCursorAdapter.swapCursor(null);

    }
</pre>

<p>
    You now have the key pieces of an app that matches a search string to contact names and returns
    the result in a {@link android.widget.ListView}. The user can click a contact name to select it.
    This triggers a listener, in which you can work further with the contact's data. For example,
    you can retrieve the contact's details. To learn how to do this, continue with the next
    lesson, <a href="#retrieve-details.html">Retrieving Details for a Contact</a>.
</p>
<p>
    To learn more about search user interfaces, read the API guide
    <a href="{@docRoot}guide/topics/search/search-dialog.html">Creating a Search Interface</a>.
</p>
<p>
    The remaining sections in this lesson demonstrate other ways of finding contacts in the
    Contacts Provider.
</p>
<h2 id="TypeMatch">Match a Contact By a Specific Type of Data</h2>
<p>
    This technique allows you to specify the type of data you want to match. Retrieving
    by name is a specific example of this type of query, but you can also do it for any of the types
    of detail data associated with a contact. For example, you can retrieve contacts that have a
    specific postal code; in this case, the search string has to match data stored in a postal code
    row.
</p>
<p>
    To implement this type of retrieval, first implement the following code, as listed in
    previous sections:
</p>
<ul>
    <li>
        Request Permission to Read the Provider.
    </li>
    <li>
        Define ListView and item layouts.
    </li>
    <li>
        Define a Fragment that displays the list of contacts.
    </li>
    <li>
        Define global variables.
    </li>
    <li>
        Initialize the Fragment.
    </li>
    <li>
        Set up the CursorAdapter for the ListView.
    </li>
    <li>
        Set the selected contact listener.
    </li>
    <li>
        Define constants for the Cursor column indexes.
        <p>
            Although you're retrieving data from a different table, the order of the columns in
            the projection is the same, so you can use the same indexes for the Cursor.
        </p>
    </li>
    <li>
        Define the onItemClick() method.
    </li>
    <li>
        Initialize the loader.
    </li>
    <li>

        Implement onLoadFinished() and onLoaderReset().
    </li>
</ul>
<p>
    The following steps show you the additional code you need to match a search string to
    a particular type of detail data and display the results.
</p>
<h3>Choose the data type and table</h3>
<p>
    To search for a particular type of detail data, you have to know the custom MIME type value
    for the data type. Each data type has a unique MIME type
    value defined by a constant <code>CONTENT_ITEM_TYPE</code> in the subclass of
    {@link android.provider.ContactsContract.CommonDataKinds} associated with the data type.
    The subclasses have names that indicate their data type; for example, the subclass for email
    data is {@link android.provider.ContactsContract.CommonDataKinds.Email}, and the custom MIME
    type for email data is defined by the constant
    {@link android.provider.ContactsContract.CommonDataKinds.Email#CONTENT_ITEM_TYPE
    Email.CONTENT_ITEM_TYPE}.
</p>
<p>
    Use the {@link android.provider.ContactsContract.Data} table for your search. All of the
    constants you need for your projection, selection clause, and sort order are defined in or
    inherited by this table.
</p>
<h3 id="SpecificProjection">Define a projection</h3>
<p>
    To define a projection, choose one or more of the columns defined in
    {@link android.provider.ContactsContract.Data} or the classes from which it inherits. The
    Contacts Provider does an implicit join between {@link android.provider.ContactsContract.Data}
    and other tables before it returns rows. For example:
</p>
<pre>
    &#64;SuppressLint("InlinedApi")
    private static final String[] PROJECTION =
        {
            /*
             * The detail data row ID. To make a ListView work,
             * this column is required.
             */
            Data._ID,
            // The primary display name
            Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.HONEYCOMB ?
                    Data.DISPLAY_NAME_PRIMARY :
                    Data.DISPLAY_NAME,
            // The contact's _ID, to construct a content URI
            Data.CONTACT_ID
            // The contact's LOOKUP_KEY, to construct a content URI
            Data.LOOKUP_KEY (a permanent link to the contact
        };
</pre>
<h3 id="SpecificCriteria">Define search criteria</h3>
<p>
    To search for a string within a particular type of data, construct a selection clause from
    the following:
</p>
<ul>
    <li>
        The name of the column that contains your search string. This name varies by data type,
        so you need to find the subclass of
        {@link android.provider.ContactsContract.CommonDataKinds} that corresponds to the data type
        and then choose the column name from that subclass. For example, to search for
        email addresses, use the column
        {@link android.provider.ContactsContract.CommonDataKinds.Email#ADDRESS Email.ADDRESS}.
    </li>
    <li>
        The search string itself, represented as the "?" character in the selection clause.
    </li>
    <li>
        The name of the column that contains the custom MIME type value. This name is always
        {@link android.provider.ContactsContract.Data#MIMETYPE Data.MIMETYPE}.
    </li>
    <li>
        The custom MIME type value for the data type. As described previously, this is the constant
        <code>CONTENT_ITEM_TYPE</code> in the
        {@link android.provider.ContactsContract.CommonDataKinds} subclass. For example, the MIME
        type value for email data is
        {@link android.provider.ContactsContract.CommonDataKinds.Email#CONTENT_ITEM_TYPE
        Email.CONTENT_ITEM_TYPE}. Enclose the value in single quotes by concatenating a
        "<code>'</code>" (single quote) character to the start and end of the constant; otherwise,
        the provider interprets the value as a variable name rather than as a string value.
        You don't need to use a placeholder for this value, because you're using a constant
        rather than a user-supplied value.
    </li>
</ul>
<p>
    For example:
</p>
<pre>
    /*
     * Constructs search criteria from the search string
     * and email MIME type
     */
    private static final String SELECTION =
            /*
             * Searches for an email address
             * that matches the search string
             */
            Email.ADDRESS + " LIKE ? " + "AND " +
            /*
             * Searches for a MIME type that matches
             * the value of the constant
             * Email.CONTENT_ITEM_TYPE. Note the
             * single quotes surrounding Email.CONTENT_ITEM_TYPE.
             */
            Data.MIMETYPE + " = '" + Email.CONTENT_ITEM_TYPE + "'";
</pre>
<p>
    Next, define variables to contain the selection argument:
</p>
<pre>
    String mSearchString;
    String[] mSelectionArgs = { "" };
</pre>
<h3 id="SpecificLoader">Implement onCreateLoader()</h3>
<p>
    Now that you've specified the data you want and how to find it, define a query in your
    implementation of {@link android.support.v4.app.LoaderManager.LoaderCallbacks#onCreateLoader
    onCreateLoader()}. Return a new {@link android.support.v4.content.CursorLoader} from this
    method, using your projection, selection text expression, and selection array as
    arguments. For a content URI, use
    {@link android.provider.ContactsContract.Data#CONTENT_URI Data.CONTENT_URI}. For example:
</p>
<pre>
    &#64;Override
    public Loader&lt;Cursor&gt; onCreateLoader(int loaderId, Bundle args) {
        // OPTIONAL: Makes search string into pattern
        mSearchString = "%" + mSearchString + "%";
        // Puts the search string into the selection criteria
        mSelectionArgs[0] = mSearchString;
        // Starts the query
        return new CursorLoader(
                getActivity(),
                Data.CONTENT_URI,
                PROJECTION,
                SELECTION,
                mSelectionArgs,
                null
        );
    }
</pre>
<p>
    These code snippets are the basis of a simple reverse lookup based on a specific type of detail
    data. This is the best technique to use if your app focuses on a particular type of data, such
    as emails, and you want allow users to get the names associated with a piece of data.
</p>
<h2 id="GeneralMatch">Match a Contact By Any Type of Data</h2>
<p>
    Retrieving a contact based on any type of data returns contacts if any of their data matches a
    the search string, including name, email address, postal address, phone number, and so forth.
    This results in a broad set of search results. For example, if the search string
    is "Doe", then searching for any data type returns the contact "John Doe"; it also returns
    contacts who live on "Doe Street".
</p>
<p>
    To implement this type of retrieval, first implement the following code, as listed in
    previous sections:
</p>
<ul>
    <li>
        Request Permission to Read the Provider.
    </li>
    <li>
        Define ListView and item layouts.
    </li>
    <li>
        Define a Fragment that displays the list of contacts.
    </li>
    <li>
        Define global variables.
    </li>
    <li>
        Initialize the Fragment.
    </li>
    <li>
        Set up the CursorAdapter for the ListView.
    </li>
    <li>
        Set the selected contact listener.
    </li>
    <li>
        Define a projection.
    </li>
    <li>
        Define constants for the Cursor column indexes.
        <p>
            For this type of retrieval, you're using the same table you used in the section
            <a href="#NameMatch">Match a Contact by Name and List the Results</a>. Use the
            same column indexes as well.
        </p>
    </li>
    <li>
        Define the onItemClick() method.
    </li>
    <li>
        Initialize the loader.
    </li>
    <li>

        Implement onLoadFinished() and onLoaderReset().
    </li>
</ul>
<p>
    The following steps show you the additional code you need to match a search string to
    any type of data and display the results.
</p>
<h3 id="NoSelection">Remove selection criteria</h3>
<p>
    Don't define the <code>SELECTION</code> constants or the <code>mSelectionArgs</code> variable.
    These aren't used in this type of retrieval.
</p>
<h3 id="CreateLoaderAny">Implement onCreateLoader()</h3>
<p>
    Implement the {@link android.support.v4.app.LoaderManager.LoaderCallbacks#onCreateLoader
    onCreateLoader()} method, returning a new {@link android.support.v4.content.CursorLoader}.
    You don't need to convert the search string into a pattern, because the Contacts Provider does
    that automatically. Use
    {@link android.provider.ContactsContract.Contacts#CONTENT_FILTER_URI
    Contacts.CONTENT_FILTER_URI} as the base URI, and append your search string to it by calling
    {@link android.net.Uri#withAppendedPath Uri.withAppendedPath()}. Using this URI
    automatically triggers searching for any data type, as shown in the following example:
</p>
<pre>
    &#64;Override
    public Loader&lt;Cursor&gt; onCreateLoader(int loaderId, Bundle args) {
        /*
         * Appends the search string to the base URI. Always
         * encode search strings to ensure they're in proper
         * format.
         */
        Uri contentUri = Uri.withAppendedPath(
                Contacts.CONTENT_FILTER_URI,
                Uri.encode(mSearchString));
        // Starts the query
        return new CursorLoader(
                getActivity(),
                contentUri,
                PROJECTION,
                null,
                null,
                null
        );
    }
</pre>
<p>
    These code snippets are the basis of an app that does a broad search of the Contacts Provider.
    The technique is useful for apps that want to implement functionality similar to the
    People app's contact list screen.
</p>
