Content providers in Android

AlexeyUstenko 4,709 views 51 slides Nov 10, 2012
Slide 1
Slide 1 of 51
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43
Slide 44
44
Slide 45
45
Slide 46
46
Slide 47
47
Slide 48
48
Slide 49
49
Slide 50
50
Slide 51
51

About This Presentation

No description available for this slideshow.


Slide Content

Content Providers in Android


Overall structure

Interaction with Content Provider

Constructing query

Retreiving cursor asyncronuously

Provider permissions

Creating Content Provider

Questions


Overall structure

Interaction with Content Provider

Constructing query

Retreiving cursor asyncronuously

Provider permissions

Creating Content Provider

Questions

Overall structure
Content Provider
Application #1
Activity #1
Activity #2
Activity #3
Database Files XML
Remote
connection

Activity #1
Application #2
Activity #1
Application #3
Activity #2

Content Provider is a source
Content Provider
Application #1
Activity #1
Activity #2
Activity #3
Database Files XML
Remote
connection

Activity #1
Application #2
Activity #1
Application #3
Activity #2

For some consumers
Content Provider
Application #1
Activity #1
Activity #2
Activity #3
Database Files XML
Remote
connection

Activity #1
Application #2
Activity #1
Application #3
Activity #2

Gives access to variety types of data
Content Provider
Application #1
Activity #1
Activity #2
Activity #3
Database Files XML
Remote
connection

Activity #1
Application #2
Activity #1
Application #3
Activity #2

Overall structure
Content Provider
Application #1
Activity #1
Activity #2
Activity #3
Database Files XML
Remote
connection

Activity #1
Application #2
Activity #1
Application #3
Activity #2


Overall structure

Interaction with Content Provider

Constructing query

Retreiving cursor asyncronuously

Provider permissions

Creating Content Provider

Questions

Interaction with Content Provider
Content Provider
Application #1
Activity #1
Activity #2
Activity #3
Database Files XML
Remote
connection

Activity #1
Application #2
Activity #1
Application #3
Activity #2

Activity to Content Provider access
Content Provider
Activity
ContentResolverCursor
CursorAdapter ListView

Activity
Content Provider
Activity
ContentResolverCursor
CursorAdapter ListView

Performing request
ContentResolver
Query
Delete
Update
Insert
Content Provider
URI

URI
content://com.example.provider/articles
Scheme
Authority Path


Overall structure

Interaction with Content Provider

Constructing query

Retreiving cursor asyncronuously

Provider permissions

Creating Content Provider

Questions

Constructing query
SELECT _id, title, content, date
FROM articles
WHERE date >= 1352470000
ORDER BY date ASC

Constructing query
String[] mProjection =
{
"_id",
"title",
"content",
"date",
};
String mSelection = "date >= ?";
String[] mSelectionArgs = { "1352470000"};
String mSortOrder = "date ASC";
Cursor cursor = getContentResolver().query(
MyContentProvider.ARTICLES_CONTENT_URI ,
mProjection,
mSelection,
mSelectionArgs,
mSortOrder);

Constructing query
String[] mProjection =
{
"_id",
"title",
"content",
"date",
};
String mSelection = "date >= ?";
String[] mSelectionArgs = {"1352470000"};
String mSortOrder = "date ASC";
Cursor cursor = getContentResolver().query(
MyContentProvider.ARTICLES_CONTENT_URI ,
mProjection,
mSelection,
mSelectionArgs,
mSortOrder);

Constructing query
String[] mProjection =
{
"_id",
"title",
"content",
"date",
};
String mSelection = "date >= ?";
String[] mSelectionArgs = { "1352470000"};
String mSortOrder = "date ASC";
Cursor cursor = getContentResolver().query(
MyContentProvider.ARTICLES_CONTENT_URI ,
mProjection,
mSelection,
mSelectionArgs,
mSortOrder);

Constructing query
String[] mProjection =
{
"_id",
"title",
"content",
"date",
};
String mSelection = "date >= ?";
String[] mSelectionArgs = {"1352470000"};
String mSortOrder = "date ASC";
Cursor cursor = getContentResolver().query(
MyContentProvider.ARTICLES_CONTENT_URI ,
mProjection,
mSelection,
mSelectionArgs,
mSortOrder);

Constructing query
String[] mProjection =
{
"_id",
"title",
"content",
"date",
};
String mSelection = "date >= ?";
String[] mSelectionArgs = {"1352470000"};
String mSortOrder = "date ASC";
Cursor cursor = getContentResolver().query (
MyContentProvider.ARTICLES_CONTENT_URI ,
mProjection,
mSelection,
mSelectionArgs,
mSortOrder);

Constructing query
String[] mProjection =
{
"_id",
"title",
"content",
"date",
};
String mSelection = "date >= ?";
String[] mSelectionArgs = {"1352470000"};
String mSortOrder = "date ASC";
Cursor cursor = getContentResolver().query(
MyContentProvider.ARTICLES_CONTENT_URI ,
mProjection,
mSelection,
mSelectionArgs,
mSortOrder);

Cursor
_id title content date
1 First article Lorem ipsum... 1352475013
2 Second article Dolor sit amet... 1352471413
... ... ... ...
if (mCursor != null) {
while (mCursor.moveToNext()) {
String title = mCursor.getString(Columns.TITLE);
}
}


Overall structure

Interaction with Content Provider

Constructing query

Retreiving cursor asyncronuously

Provider permissions

Creating Content Provider

Questions

Activity & blocking queries
Content Provider
Activity
ContentResolverCursor
CursorAdapter ListView

Activity & non blocking queries
Content Provider
Activity
ContentResolverCursor
CursorAdapter ListView
CursorLoader
AsyncQueryHandler

Activity & Loader
Content Provider
Activity
ContentResolverCursor
CursorAdapter ListView
CursorLoader
AsyncQueryHandler

Activity & Loader
getSupportLoaderManager().initLoader(0, null, this);
...
public class ArticlesActivity extends FragmentActivity implements
LoaderCallbacks<Cursor> {
...
public Loader<Cursor> onCreateLoader( int id, Bundle args) {
return new CursorLoader(
this, // context
MyContentProvider.ARTICLES_CONTENT_URI ,
mProjection,
mSelection,
mSelectionArgs,
mSortOrder);
}
public void onLoadFinished(
Loader<Cursor> loader,
Cursor cursor) {
mAdapter.swapCursor(cursor);
}

Activity & Loader
getSupportLoaderManager().initLoader(0, null, this);
...
public class ArticlesActivity extends FragmentActivity implements
LoaderCallbacks<Cursor> {
...
public Loader<Cursor> onCreateLoader( int id, Bundle args) {
return new CursorLoader(
this, // context
MyContentProvider.ARTICLES_CONTENT_URI ,
mProjection,
mSelection,
mSelectionArgs,
mSortOrder);
}
public void onLoadFinished(
Loader<Cursor> loader,
Cursor cursor) {
mAdapter.swapCursor(cursor);
}

Activity & Loader
getSupportLoaderManager().initLoader(0, null, this);
...
public class ArticlesActivity extends FragmentActivity implements
LoaderCallbacks<Cursor> {
...
public Loader<Cursor> onCreateLoader( int id, Bundle args) {
return new CursorLoader(
this, // context
MyContentProvider.ARTICLES_CONTENT_URI ,
mProjection,
mSelection,
mSelectionArgs,
mSortOrder);
}
public void onLoadFinished(
Loader<Cursor> loader,
Cursor cursor) {
mAdapter.swapCursor(cursor);
}

Activity & Loader
getSupportLoaderManager().initLoader(0, null, this);
...
public class ArticlesActivity extends FragmentActivity implements
LoaderCallbacks<Cursor> {
...
public Loader<Cursor> onCreateLoader( int id, Bundle args) {
return new CursorLoader(
this, // context
MyContentProvider.ARTICLES_CONTENT_URI ,
mProjection,
mSelection,
mSelectionArgs,
mSortOrder);
}
public void onLoadFinished(
Loader<Cursor> loader,
Cursor cursor) {
mAdapter.swapCursor(cursor);
}

Activity & Loader
getSupportLoaderManager().initLoader(0, null, this);
...
public class ArticlesActivity extends FragmentActivity implements
LoaderCallbacks<Cursor> {
...
public Loader<Cursor> onCreateLoader( int id, Bundle args) {
return new CursorLoader(
this, // context
MyContentProvider.ARTICLES_CONTENT_URI ,
mProjection,
mSelection,
mSelectionArgs,
mSortOrder);
}
public void onLoadFinished(
Loader<Cursor> loader,
Cursor cursor) {
mAdapter.swapCursor(cursor);
}

Activity & AsyncQueryHandler
Content Provider
Activity
ContentResolverCursor
CursorAdapter ListView
CursorLoader
AsyncQueryHandler

Activity & AsyncQueryHandler
private AsyncQueryHandler mHandler;
...
mHandler = new MyAsyncQueryHandler(getContentResolver());
mHandler.startQuery(
0, // token
null, // cookie
MyContentProvider.ARTICLES_CONTENT_URI ,
mProjection,
mSelection,
mSelectionArgs,
mSortOrder);

Activity & AsyncQueryHandler
class MyAsyncQueryHandler extends AsyncQueryHandler {
public MyAsyncQueryHandler(ContentResolver cr) {
super(cr);
}

@Override
protected void onQueryComplete(
int token,
Object cookie,
Cursor cursor) {
mAdapter.swapCursor(cursor);
}
}


Overall structure

Interaction with Content Provider

Constructing query

Retreiving cursor asyncronuously

Provider permissions

Creating Content Provider

Questions

Permissions
<permission
android:name="com.example.provider.permission.READ_ARTICLES"
android:protectionLevel ="normal" />
<provider android:name= ".MyContentProvider"
android:exported="false"
android:authorities= "com.example.provider"
android:permission="com.example.provider.permission.READ_ARTICLES"
/>
<uses-permission
android:name="com.example.provider.permission.READ_ARTICLES" />

Permissions
<permission
android:name="com.example.provider.permission.READ_ARTICLES"
android:protectionLevel= "normal" />
<provider android:name=".MyContentProvider"
android:exported="false"
android:authorities="com.example.provider"
android:permission="com.example.provider.permission.READ_ARTICLES"
/>
<uses-permission
android:name="com.example.provider.permission.READ_ARTICLES" />

Permissions
<permission
android:name="com.example.provider.permission.READ_ARTICLES"
android:protectionLevel= "normal" />
<provider android:name= ".MyContentProvider"
android:exported="false"
android:authorities= "com.example.provider"
android:permission="com.example.provider.permission.READ_ARTICLES"
/>
<uses-permission
android:name="com.example.provider.permission.READ_ARTICLES" />


Overall structure

Interaction with Content Provider

Constructing query

Retreiving cursor asyncronuously

Provider permissions

Creating Content Provider

Questions

Creating content provider
public class MyContentProvider extends ContentProvider {
...
onCreate()
query()
insert()
update()
delete()
getType()

URI matching
content://com.example.provider/articles
content://com.example.provider/articles/*
content://com.example.provider/articles/#

URI matching
content://com.example.provider/articles
content://com.example.provider/articles/*
content://com.example.provider/articles/#

URI matching
content://com.example.provider/articles
content://com.example.provider/articles/*
content://com.example.provider/articles/#

URI matching
sUriMatcher.addURI("com.example.provider" , "articles/#", 0);
sUriMatcher.addURI("com.example.provider" , "articles/today", 1);
sUriMatcher.addURI("com.example.provider" , "articles/history/*" , 2);
...
public String getType(Uri uri) {
switch (sUriMatcher.match(uri)) {
...

URI matching
sUriMatcher.addURI("com.example.provider", "articles/#", 0);
sUriMatcher.addURI("com.example.provider", "articles/today", 1);
sUriMatcher.addURI("com.example.provider", "articles/history/*", 2);
...
public String getType(Uri uri) {
switch (sUriMatcher.match(uri)) {
...

MIME types
vnd.android.cursor.dir/vnd.com.example.provider .article
vnd.android.cursor.item/vnd.com.example.provider .article
getType()
getStreamTypes()
{ "image/jpeg", "image/png", "image/gif" }

MIME types
vnd.android.cursor.dir/vnd.com.example.provider.article
vnd.android.cursor.item/vnd.com.example.provider.article
getType()
getStreamTypes()
{ "image/jpeg", "image/png", "image/gif" }

Questions
Thank you!

Useful links
http://developer.android.com/guide/topics/providers/content-provider-basics.html
http://developer.android.com/guide/topics/providers/content-provider-creating.html
http://developer.android.com/guide/topics/security/permissions.html
http://gdg.org.ua
http://dnipro.gdg.org.ua

About speaker
Alexey Ustenko — Android developer
Coordniator of GDG Dnipropetrovs'k
@ustav