51
Content Providers in Android

Content providers in Android

Embed Size (px)

Citation preview

Page 1: Content providers in Android

Content Providers in Android

Page 2: Content providers in Android

● Overall structure

● Interaction with Content Provider● Constructing query● Retreiving cursor asyncronuously● Provider permissions● Creating Content Provider● Questions

Page 3: Content providers in Android

● Overall structure

● Interaction with Content Provider● Constructing query● Retreiving cursor asyncronuously● Provider permissions● Creating Content Provider● Questions

Page 4: Content providers in Android

Overall structure

Content Provider

Application #1

Activity #1

Activity #2

Activity #3

Database Files XML Remoteconnection …

Activity #1

Application #2

Activity #1

Application #3

Activity #2

Page 5: Content providers in Android

Content Provider is a source

Content Provider

Application #1

Activity #1

Activity #2

Activity #3

Database Files XML Remoteconnection …

Activity #1

Application #2

Activity #1

Application #3

Activity #2

Page 6: Content providers in Android

For some consumers

Content Provider

Application #1

Activity #1

Activity #2

Activity #3

Database Files XML Remoteconnection …

Activity #1

Application #2

Activity #1

Application #3

Activity #2

Page 7: Content providers in Android

Gives access to variety types of data

Content Provider

Application #1

Activity #1

Activity #2

Activity #3

Database Files XML Remoteconnection …

Activity #1

Application #2

Activity #1

Application #3

Activity #2

Page 8: Content providers in Android

Overall structure

Content Provider

Application #1

Activity #1

Activity #2

Activity #3

Database Files XML Remoteconnection …

Activity #1

Application #2

Activity #1

Application #3

Activity #2

Page 9: Content providers in Android

● Overall structure

● Interaction with Content Provider● Constructing query● Retreiving cursor asyncronuously● Provider permissions● Creating Content Provider● Questions

Page 10: Content providers in Android

Interaction with Content Provider

Content Provider

Application #1

Activity #1

Activity #2

Activity #3

Database Files XML Remoteconnection …

Activity #1

Application #2

Activity #1

Application #3

Activity #2

Page 11: Content providers in Android

Activity to Content Provider access

Content Provider

Activity

ContentResolverCursor

CursorAdapter ListView

Page 12: Content providers in Android

Activity

Content Provider

Activity

ContentResolverCursor

CursorAdapter ListView

Page 13: Content providers in Android

Performing request

ContentResolver

Query

Delete

Update

Insert

Content Provider

URI

Page 14: Content providers in Android

URI

content://com.example.provider/articles

Scheme Authority Path

Page 15: Content providers in Android

● Overall structure

● Interaction with Content Provider● Constructing query● Retreiving cursor asyncronuously● Provider permissions● Creating Content Provider● Questions

Page 16: Content providers in Android

Constructing query

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

Page 17: Content providers in Android

Constructing queryString[] 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);

Page 18: Content providers in Android

Constructing queryString[] 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);

Page 19: Content providers in Android

Constructing queryString[] 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);

Page 20: Content providers in Android

Constructing queryString[] 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);

Page 21: Content providers in Android

Constructing queryString[] 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);

Page 22: Content providers in Android

Constructing queryString[] 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);

Page 23: Content providers in Android

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); }}

Page 24: Content providers in Android

● Overall structure

● Interaction with Content Provider● Constructing query● Retreiving cursor asyncronuously● Provider permissions● Creating Content Provider● Questions

Page 25: Content providers in Android

Activity & blocking queries

Content Provider

Activity

ContentResolverCursor

CursorAdapter ListView

Page 26: Content providers in Android

Activity & non blocking queries

Content Provider

Activity

ContentResolverCursor

CursorAdapter ListView

CursorLoader

AsyncQueryHandler

Page 27: Content providers in Android

Activity & Loader

Content Provider

Activity

ContentResolverCursor

CursorAdapter ListView

CursorLoader

AsyncQueryHandler

Page 28: Content providers in Android

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); }

Page 29: Content providers in Android

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); }

Page 30: Content providers in Android

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); }

Page 31: Content providers in Android

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); }

Page 32: Content providers in Android

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); }

Page 33: Content providers in Android

Activity & AsyncQueryHandler

Content Provider

Activity

ContentResolverCursor

CursorAdapter ListView

CursorLoader

AsyncQueryHandler

Page 34: Content providers in Android

Activity & AsyncQueryHandler

private AsyncQueryHandler mHandler;

...

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

Page 35: Content providers in Android

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); } }

Page 36: Content providers in Android

● Overall structure

● Interaction with Content Provider● Constructing query● Retreiving cursor asyncronuously● Provider permissions● Creating Content Provider● Questions

Page 37: Content providers in Android

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" />

Page 38: Content providers in Android

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" />

Page 39: Content providers in Android

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" />

Page 40: Content providers in Android

● Overall structure

● Interaction with Content Provider● Constructing query● Retreiving cursor asyncronuously● Provider permissions● Creating Content Provider● Questions

Page 41: Content providers in Android

Creating content provider

public class MyContentProvider extends ContentProvider {...

onCreate()

query()

insert()

update()

delete()

getType()

Page 42: Content providers in Android

URI matching

content://com.example.provider/articles

content://com.example.provider/articles/*

content://com.example.provider/articles/#

Page 43: Content providers in Android

URI matching

content://com.example.provider/articles

content://com.example.provider/articles/*

content://com.example.provider/articles/#

Page 44: Content providers in Android

URI matching

content://com.example.provider/articles

content://com.example.provider/articles/*

content://com.example.provider/articles/#

Page 45: Content providers in Android

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)) {...

Page 46: Content providers in Android

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)) {...

Page 47: Content providers in Android

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" }

Page 48: Content providers in Android

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" }

Page 49: Content providers in Android

Questions

Thank you!

Page 50: Content providers in Android

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

Page 51: Content providers in Android

About speaker

Alexey Ustenko — Android developerCoordniator of GDG Dnipropetrovs'k

@ustav