Training Content Providers in Android

A content providers component provides data from one application to another upon request. These requests are handled with ContentResolver class methods. 

Content providers can use a variety of methods to store their data, and data can be stored in databases, files, or even on the network.

Sometimes data needs to be shared in applications. This is where content providers come in handy.

Content providers let you centralize content in one place and have access to different applications if needed. The content provider behaves very much like a database. You can add, update, delete, and query content using the insert (), update (), delete, and query () methods. In most cases this data is stored in a SQlite database.

Content providers are implemented as a subclass of the ContentProvider class and must implement a standard set of APIs that enable other applications to transact.

public class My Application extends ContentProvider {

}

Content providers URIs

To query from the content provider, we specify the query string as URI, which has the following format –

<prefix>: // <authority> / <data_type> / <id>

Here are the details of the different parts of the URI –

Number Description
1 prefixAlways set to content: //.
۲ authoritySpecifies the content provider name, for example contacts, browser, etc. for third-party content providers, this section can have a fully descriptive name, such as com.tutorialspoint.statusprovider
3 data_typeIndicates the type of data provided by the specific content provider. For example, if you get all the contacts from the contacts content provider, the data path will be people and the URI will look like this: content: // contacts / people
4 idThis section specifies the specific record requested. For example, if you are looking for the fifth person contact number in the contact content provider, the URI looks like this: content: // contacts / people / 5

Create  content providers

This section contains some simple steps to create a content provider.

  • First of all you need to create a Content Provider class that extends the ContentProviderbaseclass.
  • Second, you need to define the URL of your content provider that will be used to access the content.
  • Next you need to create your database to preserve the content. Android typically uses a SQLite database, and the framework must use the onCreate () method, which uses the SQLite Open Helper method to create or open a content provider database. Once the application is launched, the onCreate () controller calls each of its content providers in the main application thread.
  • Next you need to implement the Content Provider queries to perform various database operations.
  • Finally, use the <provider> Content Provider tag in your activity file.

Here is a list of methods you should override in the Content Provider class for the Content Provider to work –

C: \ Users \ Mr \ Desktop \ content1.jpg

  • onCreate () This method is called when the provider starts.
  • query () This method receives a request from the client. The result is returned as a cursor object.
  • Insert () This method inserts a new record in the content provider.
  • Delete () This method removes an existing record from the content provider.
  • Update () This method updates the existing record from the content provider.
  • getType () This method returns the MIME type of data in the given URI.

Example

This example illustrates how to create a ContentProvider. So let’s follow the steps below, similar to the ones we followed when creating the Hello World example:

the level

Description

1 You can use Android StudioIDE to create an Android application, called My Application under the com.example.MyApplication package with empty activity.
۲ Modify the MainActivity.java main activity file to add two new methods, ClickAddName () and onClickRetrieveStudents ().
3 Create a new Java file called StudentProvider.java under the com.example.MyApplication package to define your actual provider and related methods.
4 Register your content provider in the AndroidManifest.xml file using the <provider… /> tag
5 Modify the default content of the res / layout / activity_main.xml file to include a small graphical user interface to add student records.
6 No need to change string.xml.Android. Android Studio takes care of the string.xml file.
7 Run the program to launch the Android emulator and see the result of the changes made in the program.

Below is the modified content of the main src / com.example.MyApplication / MainActivity.java activity file. This file can contain any of the basic life cycle methods.

We’ve added two new methods, ClickAddName () and onClickRetrieveStudents () to manage user interaction with the app.

package com.example.MyApplication;

import android.net.Uri;

import android.os.Bundle;

import android.app.Activity;

import android.content.ContentValues;

import android.content.CursorLoader;

import android.database.Cursor;

import android.view.Menu;

import android.view.View;

import android.widget.EditText;

import android.widget.Toast;

public class MainActivity extends Activity {

@Override

protected void onCreate (Bundle savedInstanceState) {

super.onCreate (savedInstanceState);

setContentView (R.layout.activity_main);

}

public void onClickAddName (View view) {

// Add a new student record

ContentValues ​​values ​​= new ContentValues ​​();

values.put (StudentsProvider.NAME,

((EditText) findViewById (R.id.editText2)). GetText (). ToString ());

values.put (StudentsProvider.GRADE,

((EditText) findViewById (R.id.editText3)). GetText (). ToString ());

Uri uri = getContentResolver (). Insert (

StudentsProvider.CONTENT_URI, values);

Toast.makeText (getBaseContext (),

uri.toString (), Toast.LENGTH_LONG) .show ();

}

public void onClickRetrieveStudents (View view) {

// Retrieve student records

String URL = “content: //com.example.MyApplication.StudentsProvider”;

Uri students = Uri.parse (URL);

Cursor c = managedQuery (students, null, null, null, “name”);

if (c.moveToFirst ()) {

do {

Toast.makeText (this,

c.getString (c.getColumnIndex (StudentsProvider._ID)) +

“,” + C.getString (c.getColumnIndex (StudentsProvider.NAME)) +

“,” + C.getString (c.getColumnIndex (StudentsProvider.GRADE)),

Toast.LENGTH_SHORT) .show ();

} while (c.moveToNext ());

}

}

}

Create a new StudentProvider.java file under the com.example.MyApplication package. Below is the content of src / com.example.MyApplication / StudentProvider.java-

package com.example.MyApplication;

import java.util.HashMap;

import android.content.ContentProvider;

import android.content.ContentUris;

import android.content.ContentValues;

import android.content.Context;

import android.content.UriMatcher;

import android.database.Cursor;

import android.database.SQLException;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;

import android.database.sqlite.SQLiteQueryBuilder;

import android.net.Uri;

import android.text.TextUtils;

public class StudentsProvider extends ContentProvider {

static final String PROVIDER_NAME = “com.example.MyApplication.StudentsProvider”;

static final String URL = “content: //” + PROVIDER_NAME + “/ students”;

static final Uri CONTENT_URI = Uri.parse (URL);

static final String _ID = “_id”;

static final String NAME = “name”;

static final String GRADE = “grade”;

private static HashMap <String, String> STUDENTS_PROJECTION_MAP;

static final int STUDENTS = 1;

static final int STUDENT_ID = 2;

static final UriMatcher uriMatcher;

static {

uriMatcher = new UriMatcher (UriMatcher.NO_MATCH);

uriMatcher.addURI (PROVIDER_NAME, “students”, STUDENTS);

uriMatcher.addURI (PROVIDER_NAME, “students / #”, STUDENT_ID);

}

/ **

* Database specific constant declarations

* /

private SQLiteDatabase db;

static final String DATABASE_NAME = “College”;

static final String STUDENTS_TABLE_NAME = “students”;

static final int DATABASE_VERSION = 1;

static final String CREATE_DB_TABLE =

”CREATE TABLE” + STUDENTS_TABLE_NAME +

”(_Id INTEGER PRIMARY KEY AUTOINCREMENT,” +

”Name TEXT NOT NULL,” +

”Grade TEXT NOT NULL);”;

/ **

* Helper class that actually creates and manages

* the provider’s underlying data repository.

* /

private static class DatabaseHelper extends SQLiteOpenHelper {

DatabaseHelper (Context context) {

super (context, DATABASE_NAME, null, DATABASE_VERSION);

}

@Override

public void onCreate (SQLiteDatabase db) {

db.execSQL (CREATE_DB_TABLE);

}

@Override

public void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion) {

db.execSQL (“DROP TABLE IF EXISTS” + STUDENTS_TABLE_NAME);

onCreate (db);

}

}

@Override

public boolean onCreate () {

Context context = getContext ();

DatabaseHelper dbHelper = new DatabaseHelper (context);

/ **

* Create a write able database which will trigger its

* creation if it does not already exist.

* /

db = dbHelper.getWritableDatabase ();

return (db == null)? false: true;

}

@Override

public Uri insert (Uri uri, ContentValues ​​values) {

/ **

* Add a new student record

* /

long rowID = db.insert (STUDENTS_TABLE_NAME, “”, values);

/ **

* If record is added successfully

* /

if (rowID> 0) {

Uri _uri = ContentUris.withAppendedId (CONTENT_URI, rowID);

getContext (). getContentResolver (). notifyChange (_uri, null);

return _uri;

}

throw new SQLException (“Failed to add a record into” + uri);

}

@Override

public Cursor query (Uri uri, String [] projection,

String selection, String [] selectionArgs, String sortOrder) {

SQLiteQueryBuilder qb = new SQLiteQueryBuilder ();

qb.setTables (STUDENTS_TABLE_NAME);

switch (uriMatcher.match (uri)) {

case STUDENTS:

qb.setProjectionMap (STUDENTS_PROJECTION_MAP);

break;

case STUDENT_ID:

qb.appendWhere (_ID + “=” + uri.getPathSegments (). get (1));

break;

default:

}

if (sortOrder == null || sortOrder == “”) {

/ **

* By default sort on student names

* /

sortOrder = NAME;

}

Cursor c = qb.query (db, projection, selection,

selectionArgs, null, null, sortOrder);

/ **

* register to watch a content URI for changes

* /

c.setNotificationUri (getContext (). getContentResolver (), uri);

return c;

}

@Override

public int delete (Uri uri, String selection, String [] selectionArgs) {

int count = 0;

switch (uriMatcher.match (uri)) {

case STUDENTS:

count = db.delete (STUDENTS_TABLE_NAME, selection, selectionArgs);

break;

case STUDENT_ID:

String id = uri.getPathSegments (). Get (1);

count = db.delete (STUDENTS_TABLE_NAME, _ID + ”=” + id +

(! TextUtils.isEmpty (selection)? “

AND (”+ selection + ‘)’:“ ”), selectionArgs);

break;

default:

throw new IllegalArgumentException (“Unknown URI” + uri);

}

getContext (). getContentResolver (). notifyChange (uri, null);

return count;

}

@Override

public int update (Uri uri, ContentValues ​​values,

String selection, String [] selectionArgs) {

int count = 0;

switch (uriMatcher.match (uri)) {

case STUDENTS:

count = db.update (STUDENTS_TABLE_NAME, values, selection, selectionArgs);

break;

case STUDENT_ID:

count = db.update (STUDENTS_TABLE_NAME, values,

_ID + ”=” + uri.getPathSegments (). Get (1) +

(! TextUtils.isEmpty (selection)? “

AND (”+ selection + ‘)’:“ ”), selectionArgs);

break;

default:

throw new IllegalArgumentException (“Unknown URI” + uri);

}

getContext (). getContentResolver (). notifyChange (uri, null);

return count;

}

@Override

public String getType (Uri uri) {

switch (uriMatcher.match (uri)) {

/ **

* Get all student records

* /

case STUDENTS:

return “vnd.android.cursor.dir / vnd.example.students”;

/ **

* Get a particular student

* /

case STUDENT_ID:

return “vnd.android.cursor.item / vnd.example.students”;

default:

throw new IllegalArgumentException (“Unsupported URI:” + uri);

}

}

}

Below you will find the modified content in the AndroidManifest.xml file. Here we have added the <provider… /> tag to include our content provider:

<? xml version = ”1.0 ″ encoding =” utf-8 ″?>

<manifest xmlns: android = ”http://schemas.android.com/apk/res/android”

package = ”com.example.MyApplication”>

<application

android: allowBackup = ”true”

android: icon = ”@ mipmap / ic_launcher”

android: label = ”@ string / app_name”

android: supportsRtl = ”true”

android: theme = ”@ style / AppTheme”>

<activity android: name = ”. MainActivity”>

<intent-filter>

<action android: name = ”android.intent.action.MAIN” />

<category android: name = ”android.intent.category.LAUNCHER” />

</intent-filter>

</activity>

<provider android: name = ”StudentsProvider”

android: authorities = ”com.example.MyApplication.StudentsProvider” />

</application>

</manifest>

Below is the content of the res / layout / activity_main.xml file_

<? xml version = ”1.0 ″ encoding =” utf-8 ″?>

<RelativeLayout xmlns: android = ”http://schemas.android.com/apk/res/android”

xmlns: tools = ”http://schemas.android.com/tools”

android: layout_width = ”match_parent”

android: layout_height = ”match_parent”

android: paddingBottom = ”@ dimen / activity_vertical_margin”

android: paddingLeft = ”@ dimen / activity_horizontal_margin”

android: paddingRight = ”@ dimen / activity_horizontal_margin”

android: paddingTop = ”@ dimen / activity_vertical_margin”

tools: context = ”com.example.MyApplication.MainActivity”>

<TextView

android: id = ”@ + id / textView1 ″

android: layout_width = ”wrap_content”

android: layout_height = ”wrap_content”

android: text = ”Content provider”

android: layout_alignParentTop = ”true”

android: layout_centerHorizontal = ”true”

android: textSize = ”30dp” />

<TextView

android: id = ”@ + id / textView2 ″

android: layout_width = ”wrap_content”

android: layout_height = ”wrap_content”

android: text = ”Tutorials point“

android: textColor = ”# ff87ff09 ″

android: textSize = ”30dp”

android: layout_below = ”@ + id / textView1 ″

android: layout_centerHorizontal = ”true” />

<ImageButton

android: layout_width = ”wrap_content”

android: layout_height = ”wrap_content”

android: id = ”@ + id / imageButton”

android: src = ”@ drawable / abc”

android: layout_below = ”@ + id / textView2 ″

android: layout_centerHorizontal = ”true” />

<Button

android: layout_width = ”wrap_content”

android: layout_height = ”wrap_content”

android: id = ”@ + id / button2 ″

android: text = ”Add Name”

android: layout_below = ”@ + id / editText3 ″

android: layout_alignRight = ”@ + id / textView2 ″

android: layout_alignEnd = ”@ + id / textView2 ″

android: layout_alignLeft = ”@ + id / textView2 ″

android: layout_alignStart = ”@ + id / textView2 ″

android: onClick = ”onClickAddName” />

<EditText

android: layout_width = ”wrap_content”

android: layout_height = ”wrap_content”

android: id = ”@ + id / editText”

android: layout_below = ”@ + id / imageButton”

android: layout_alignRight = ”@ + id / imageButton”

android: layout_alignEnd = ”@ + id / imageButton” />

<EditText

android: layout_width = ”wrap_content”

android: layout_height = ”wrap_content”

android: id = ”@ + id / editText2 ″

android: layout_alignTop = ”@ + id / editText”

android: layout_alignLeft = ”@ + id / textView1 ″

android: layout_alignStart = ”@ + id / textView1 ″

android: layout_alignRight = ”@ + id / textView1 ″

android: layout_alignEnd = ”@ + id / textView1 ″

android: hint = ”Name”

android: textColorHint = ”@ android: color / holo_blue_light” />

<EditText

android: layout_width = ”wrap_content”

android: layout_height = ”wrap_content”

android: id = ”@ + id / editText3 ″

android: layout_below = ”@ + id / editText”

android: layout_alignLeft = ”@ + id / editText2 ″

android: layout_alignStart = ”@ + id / editText2 ″

android: layout_alignRight = ”@ + id / editText2 ″

android: layout_alignEnd = ”@ + id / editText2 ″

android: hint = ”Grade”

android: textColorHint = ”@ android: color / holo_blue_bright” />

<Button

android: layout_width = ”wrap_content”

android: layout_height = ”wrap_content”

android: text = ”Retrive student”

android: id = ”@ + id / button”

android: layout_below = ”@ + id / button2 ″

android: layout_alignRight = ”@ + id / editText3 ″

android: layout_alignEnd = ”@ + id / editText3 ″

android: layout_alignLeft = ”@ + id / button2 ″

android: layout_alignStart = ”@ + id / button2 ″

android: onClick = ”onClickRetrieveStudents” />

</RelativeLayout>

Make sure the contents of the res / values ​​/ strings.xml file are as follows:

<? xml version = ”1.0 ″ encoding =” utf-8 ″?>

<resources>

<string name = ”app_name”> My Application </string>

</resources>;

We are now running the program. Let’s say you created your AVD while making environmental settings. To run the program from Android Studio IDE, open one of your project activity files and from the toolbar, click on the Run Android StudioRun Icon icon. Android Studio installs the program on your AVD and launches it.

If everything is correct, the Emulator window will appear below, if it took longer wait –

C: \ Users \ Mr \ Desktop \ content2.jpg

Now let’s fill in the Student Name and Grade and finally click on the Add Name button, this will add the student record to the database and a message will appear at the bottom that adds the ContentProvider URI along with the added record number. Adds to the database. This operation uses the insert () method. Repeat the process to add other students to the content provider database.

C: \ Users \ Mr \ Desktop \ content3.jpg

Once you’ve done your job of adding a record to the database, now is the time to ask ContentProvider to return those records to us, so click on the Retrieve Student button to fetch all the records. This is done according to the query () method we wrote.

You can write activities to update and delete programs by providing callback functions in the MainActivity.java file, and then change the user interface to add buttons for update and delete in the same way we did for add and read operations. , add.

This way you can use an existing content provider such as Content Book or you can use the concept of content provider in the development of database-based applications. You can use a variety of database functions such as read, write, update and delete as described in the example.

Leave a Reply

Your email address will not be published. Required fields are marked *