Home > DeveloperSection > Articles > Content provider in android

Content provider in android


Android Android 
Ratings:
0 Comment(s)
 1280  View(s)
Rate this:

Android Content Provider


Content providers manage access to a structured set of data. They encapsulate the data, and provide mechanisms for defining data security. Content providers are the standard interface that connects data in one process with code running in another process.

Content providers support the four basic operations, normally called CRUD-operations. CRUD is the acronym for create, read, update and delete. With content providers those objects simply represent data – most often a record (tuple) of a database – but they could also be a photo on your SD-card or a video on the web.

Create Content Provider

This involves number of simple steps to create your own content provider.

·         First of all you need to create a Content Provider class that extends the ContentProviderbase class.

·         Second, you need to define your content provider URI address which will be used to access the content.

·         Next you will need to create your own database to keep the content. Usually, Android uses SQLite database and framework needs to override onCreate() method which will use SQLite Open Helper method to create or open the provider's databse. When your application is launched, the onCreate() handler of each of its Content Providers is called on the main application thread.

·         Next you will have to implement Content Provider queries to perform different database specific operations.

·         Finally register your Content Provider in your acitivity file using <provider> tag.

·          

Content URIs

To query a content provider, you specify the query string in the form of a URI which has following format:

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

Here I am creating example of content provider which select and insert data via using content provider.

1.      Create an android project

2.      Add provider in AndroidManifest.xml file

 

<?xml version="1.0" encoding="utf-8"?>

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

    package="com.example.androidcontentprovider"

    android:versionCode="1"

    android:versionName="1.0" >

 

    <uses-sdk

        android:minSdkVersion="8"

        android:targetSdkVersion="18" />

 

    <application

        android:allowBackup="true"

        android:icon="@drawable/ic_launcher"

        android:label="@string/app_name"

        android:theme="@style/AppTheme" >

        <activity

        android:name="com.example.androidcontentprovider.MainActivity"

            android:label="@string/app_name" >

          <intent-filter>

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

 

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

            </intent-filter>

        </activity>

 

        <provider

    android:name="com.example.androidcontentprovider.StudentsProvider"

            android:authorities="com.example.provider.College" >

        </provider>

    </application>

 

</manifest>

3.      Add views in activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:orientation="vertical"

    android:padding="16sp" >

 

    <EditText

        android:id="@+id/txtName"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:layout_marginTop="20sp"

        android:hint="Name" />

 

    <EditText

        android:id="@+id/txtGrade"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:layout_marginTop="20sp"

        android:hint="Grade" />

 

    <Button

        android:id="@+id/btnAdd"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:layout_marginTop="20sp"

        android:onClick="onClickAddName"

        android:text="Add Name" />

 

    <Button

        android:id="@+id/btnRetrieve"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:layout_marginTop="20sp"

        android:onClick="onClickRetrieveStudents"

        android:text="Retrieve Students" />

 

</LinearLayout>

 

4.      Add following code in MainActivity.class

package com.example.androidcontentprovider;

import android.net.Uri;

import android.os.Bundle;

import android.app.Activity;

import android.content.ContentValues;

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

                }

                @Override

                public boolean onCreateOptionsMenu(Menu menu) {

                                getMenuInflater().inflate(R.menu.main, menu);

                                return true;

                }

                public void onClickAddName(View view) {

                                // Add a new student record

                                ContentValues values = new ContentValues();

 

                                values.put(StudentsProvider.NAME,

                                                                ((EditText) findViewById(R.id.txtName)).getText().toString());

 

                                values.put(StudentsProvider.GRADE,

                                                                ((EditText) findViewById(R.id.txtGrade)).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.provider.College/students";

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

                                }

                }

}

 

5.      Create an class and extends with ContentProvider. Now paste following code

 

package com.example.androidcontentprovider;

 

import java.util.HashMap;

 

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.provider.College";

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

            * doesn't 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:

             throw new IllegalArgumentException("Unknown URI " + uri);

           }

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

           }

     }

}

 

Now run your application

 

 

 


Don't want to miss updates? Please click the below button!

Follow MindStick