You are on page 1of 19

ANDROID – CONTENT

PROVIDERS

L. Grewe
Content Provider
 A content provider makes a specific set of the application's
data available to other applications.

 If you don't need to share data amongst multiple applications


you can use a database directly via SQLiteDatabase.
Built-in Content Providers
 Contacts
 MediaStore.Audio
 MediaStore.Images
 MediaStore.Video
 Browser
 CallLog
 Settings
Basic Idea – URI format
 Data mapped to a URI (CONTENT_URI)
 URI is used to access data by client

<standard_prefix>://<authority>/<data_path>/<id>

examples:
content://media/internal/images = list of all internal images on device
content://media/external/images = list of all external images on device
content://call_log/calls = list of all calls in Call Log
content://browser/bookmarks = list of bookmarks
Basic Idea – example for Contacts
Content Provider
 Data mapped to a URI (CONTENT_URI)
 URI is used to access data by client
 content://contacts/people/
 Allcontact names
 content://contacts/people/23
 Contact with _ID = 23
CONTENT_URI
 Content URI can be complex
 Rather than hardcoding exact URI everywhere
 Content Providers expose the base URI as static
field NameProvider.CONTENT_URI

public static final String AUTHORITY = “packagename.NameProvider";

public static final Uri CONTENT_URI = Uri.parse("content://"


+ AUTHORITY + "/names");
Option 1: Accessing data with a Content
Provider using CursorLoader
CursorLoader cursor Loader = new CursorLoader(Context context, Uri uri,
String[ ] projection,String selection, String[ ] selectionArgs, String sortOrder)

OPTION 1:

This is for Honeycomb


Or Later version of Android
 context = associated context
 uri = Content Provider URI
 projection =which columns to return
 selection = SQL Where clause with "WHERE"
 selectionArgs =Arguments for selection
 sortOrder = SQL ORDER BY clause
Option1: Example Accessing Content Provider
data with CursorLoader
This example:
import android.content.CursorLoader;
we ask for all contacts
// INSIDE Activity Class ******** Loads in background –does NOT
block application UI
@Override
public void onCreate(Bundle savedInstances) {
//*** other code*****
Uri allContacts = Uri.parse(“content://contacts/people”);
CursorLoader cursorLoader = new CursorLoader( this,
allContacts, //URI of content provider
null, //means return all columns
null, // WHERE clause-- won't specify.
null, // no where clause, so no arguments
null); //no order by specified
//get data from Content Provider, populates Cursor c with result set
Cursor c = cursorLoader.loadInBackground(); //LOADS in background, no blocking
Option1: Example Accessing Content Provider
data with CursorLoader
This example:

import android.widget.SimpleCursorAdapter; display results using a


import android.database.Cursor; SimpleCursorAdapter
import android.widget.CursorAdapter;
import android.provider.ContactsContract; //built in contacts content provider info
CursorAdapter.FLAG_REGIST
ER_CONTENT_OBSERVER
// INSIDE Activity Class ******** Means this adapter
registered to be informed
@Override when change in content
public void onCreate(Bundle savedInstances) { provider

//*** other code SEE PREVIOUS SLIDE***** results in c (Cursor instance)


//info will display from ContentProvider results in Cursor c
String[] columns = new String[] {ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts._ID};
int[] views = new int[] {R.id.contactName, R.id.contactID};
adapter = new SimpleCursorAdapter(this, R.layout.main, c, columns, views
Option1: Example ---- what is
SimpleCursorAdapter

 An Adapter used to represent Cursor (data result set)


 Used to populate a related View  example ….
android.app.ListActivity as one possibility

ListActivityInstance.setListAdapter(SimpleCursorAdapter_Instance)

public SimpleCursorAdapter (Context context, int layout, Cursor c, String[]


from, int[] to, int flags)
 context = context where the ListView associated with this
 layout = resource identifier of a layout file that defines the views for this list item. The layout file should
include at least those named views defined in "to"
 c = database cursor.
 from =list of column names representing the data to bind to the UI. Can be null if the cursor is not available
yet.
 to = views that should display column in the "from" parameter. These should all be TextViews. The first N
views in this list are given the values of the first N columns in the from parameter.
 flags = Flags used to determine the behavior of the adapter, as per CursorAdapter(Context, Cursor, int).
Example

 Main.xml ---interface for app’s main Activity (a


ListActivity) <TextView
<?xml version="1.0" encoding="utf-8"?>
android:id="@+id/contactName"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:textStyle="bold"
android:layout_width="fill_parent"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_height="wrap_content" />
android:orientation="vertical" >

<TextView
<ListView
android:id="@+id/contactID"
android:id="@+id/android:list"
android:layout_width="fill_parent"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
android:layout_height="wrap_content"
android:layout_weight="1"
android:stackFromBottom="false"
</LinearLayout>
android:transcriptMode="normal" />
Example --- main Activity Class
public class ProviderActivity extends ListActivity { c = cursorLoader.loadInBackground();
/** Called when the activity is first created. */
@Override String[] columns = new String[] {
public void onCreate(Bundle savedInstanceState) { ContactsContract.Contacts.DISPLAY_NAME,
super.onCreate(savedInstanceState); ContactsContract.Contacts._ID};
setContentView(R.layout.main);
Uri allContacts = ContactsContract.Contacts.CONTENT_URI; int[] views = new int[] {R.id.contactName, R.id.contactID};
String[] projection = new String[]
{ContactsContract.Contacts._ID, SimpleCursorAdapter adapter;
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts.HAS_PHONE_NUMBER}; adapter = new SimpleCursorAdapter( this, R.layout.main,
c, columns, views,
CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
Cursor c;
CursorLoader cursorLoader = new CursorLoader( this,
this.setListAdapter(adapter);
allContacts, projection,
ContactsContract.Contacts.DISPLAY_NAME + "
PrintContacts(c);
LIKE ?“, new String[] {"%Lee"},
}
ContactsContract.Contacts.DISPLAY_NAME + "
ASC");
Example --- main Activity Class
continued
private void PrintContacts(Cursor c)
{
if (c.moveToFirst()) {
do{
<<< UTILITY Method to print
String contactID = c.getString(c.getColumnIndex( out the result set returned in
ContactsContract.Contacts._ID));
String contactDisplayName = the Cursor instance c that
c.getString(c.getColumnIndex(
ContactsContract.Contacts.DISPLAY_NAME));
contains all the Contacts.
Log.v("Content Providers", contactID + ", " +
contactDisplayName);
} while (c.moveToNext());
}
}

}
Example ---some explanation
 Predefined Query String Constants
Uri allContacts = ContactsContract.Contacts.CONTENT_URI
SAME AS
Uri allContacts = Uri.parse(“content://contacts/people”);
Example ---some explanation
 Following is like saying give me all the contacts with the columns ID,
DISPLAY_NAME and HAS_PHONE_NUMBER where the
DISPLAY_NAME is Like Lee and orderby DISPLAY_NAME in
Ascending order (ASC)

String[] projection = new String[]


{ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts.HAS_PHONE_NUMBER};

Cursor c;
CursorLoader cursorLoader = new CursorLoader( this,
allContacts, projection,
ContactsContract.Contacts.DISPLAY_NAME + " LIKE ?“, new String[]
{"%Lee"},
ContactsContract.Contacts.DISPLAY_NAME + " ASC");
Predefined Query Strings
 Predefined Query String Constants
Uri allContacts = ContactsContract.Contacts.CONTENT_URI
SAME AS
Uri allContacts = Uri.parse(“content://contacts/people”);

 Other examples
 Browser.BOOKMARKS_URI
 Browser.SEARCHES_URI
 CallLog.CONTENT_URI
 MediaStore.Images.Media.INTERNAL_CONTENT_URI
 MediaStore.Images.Media.EXPERNAL_CONTENT_URI
 Settings.CONTENT_URI
Another option to query Content
Provider
Older method
Option 2: Example with
managedQuery(*)
Android.net.Uri allContacts;
allContacts = Uri.parse(“content://contacts/people”);

Cursor c = managedQuery(allContacts, null,null,null,null); //gets all contacts

OPTION 2:
OPTION 2:
ONLY FOR HISTORIC
This is for prior to Honeycomb
NEEDS!!!!!
Version of Android
Option 2: Accessing data with a Content
Provider using manaedQuery(*)
public final Cursor managedQuery(Uri uri, String[] projection,String selection,
String[] selectionArgs, String sortOrder)

OPTION 2:

This is for prior to Honeycomb


 uri = Content Provider URI Version of Android
 projection =which columns to return
 selection = SQL Where clause with "WHERE"
 selectionArgs =Arguments for selection
 sortOrder = SQL ORDER BY clause

You might also like