Android Content Providers CP

Android Content Providers (CP)

Android  content providers (CP) part supplies information from one application another on request. Figure Simplified representation of communication set up among procedures and content providers. Data is exhibited to outside applications as tables. This communication is crosswise over different packages. It resembles a database where you can insert, erase, query information in any case, dissimilar to the database, data can be kept in various structures. Along these lines content providers give an interface which will publish data by content resolver object. As opposed to bargain directly with the database, an application uses a ContentProvider (CP) as the interface between an application and the basic information.

android content providers

. With the content supplier now actualized and announced in the manifest file, some other applications can potentially get to that information (since no authorizations were pronounced the default full get to is as a result). Characterize your ContentProvider (CP) – the content supplier will utilize the classes made above to introduce the database, access, and control the information in it. The objective of this section has been to give a more definite outline of the exact steps required in executing an Android content provider with a specific emphasis on the structure and usage of the query, insert, delete and redesign strategies for the content provider class.android content providers

Android Content Providers (CP) URIs

To query a android content providers (CP), you should specify the query string in the form of a URI which has format:

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

 

Following table contain full detail of various parts of the URI –

Part              Description

prefix  –      This is constantly set to content://

authority  –  This determines the name of the content provider, for instance contacts, program,browser and so on. For outsider means third party content providers, this could be the completely qualified name, for example, com.androdevelopment.statusprovider

data_type –  This shows the kind of information that this specific provider gives. For instance, on the off chance that you are getting every one of the contacts from the Contacts content provider, then the information/data way would be individuals and URI would appear as though this content://contacts/peoples

id     – This determines the particular record requested. For instance, in the event that you are searching for contact number 5 in the Contacts content provider then URI would appear as though this substance://contacts/peoples/5.

Create Android Content Providers (CP)

This includes a number of basic steps to make your own android content providers (CP).

  • Most importantly you have to make a android Content Providers (CP) class that broadens the ContentProviderbaseclass.
  • Second, you have to characterize your content supplier URI address which will be utilized to get to the content.
  • Next, you should make your own database keep the content. Ordinarily, Android utilizes SQLite database and system needs to abrogate onCreate() method which will utilize SQLite Open Helper technique to make or open the provider’s database. At the point when your application is dispatched, the onCreate() handler of each of its Content Providers has approached the main application thread.
  • Next, you will need to actualize Content Provider queries to perform distinctive database particular operations.
  • At long last enlist your Content Provider in your activity file utilizing <provider> tag.

Following is the list of several methods through which you need to override in Content Provider class to have your Content Provider working.

android content providers

  • onCreate() – This strategy is called when the provider is begun.
  • query() – This technique gets a request from a customer. The outcome is returned as a Cursor object.
  • insert() – This technique embeds another record into the content provider.
  • delete() – This technique erases a current record from the content provider.
  • update() – This technique redesigns a current record from the content provider.
  • getType() – This technique gives back the MIME kind of the information at the given URI.

Example of Android Content Providers (CP)

This android content providers Example will defines you to how create your own Android Content Providers (CP). So just follow the given steps to similar to what we followed while creating Hello World Tutorial

Steps       Description

1   –   You will utilize Android Studio IDE to make an Android application and name it as My Application under a package com.example.My Application, with clear or empty Activity.

2    –  Modify MainActivity.java to include two new methods onClickAddName() and onClickRetrieveStudents().

3   –   Create another java file named as StudentsProvider.java under the package com.example.My Application to characterize your genuine provider and related methods.

4    –  Register your content provider in your AndroidManifest.xml file with <provider…/> tag

5   –   Modify the default content of res/design/activity_main.xml file to incorporate a little GUI to include students records.

 –    No need to change string.xml.Android studio deal with string.xml document.

7    –  Run the application to dispatch Android emulator and check the aftereffect of the progressions done in the application.

Taking after is the content of the changed of main activity  src/com.example.My Application/MainActivity.java. This file can incorporate each of the principal life cycle techniques. We have included two new methods onClickAddName() and onClickRetrieveStudents() to handle UI with the application.

package com.example.My Application;

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

   @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.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.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());
      }
   }
}

 

Create another file StudentsProvider.java under com.example.My Applicationpackage and

following is the code of src/com.example.My Application/StudentsProvider.java

package com.example.My Application;

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

 

Following is the modified content of AndroidManifest.xml file. Here we have included  <provider…/> tag to add our content provider:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.My Application"
   android:versionCode="1"
   android:versionName="1.0" >
   
   <uses-sdk
      android:minSdkVersion="8"
      android:targetSdkVersion="22" />
      
      <application
         android:allowBackup="true"
         android:icon="@drawable/ic_launcher"
         android:label="@string/app_name"
         android:theme="@style/AppTheme" >
         
      <activity
         android:name="com.example.My Application.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="StudentsProvider" 
         <android:authorities="com.example.provider.College">
      </provider>
         
   </application>
</manifest>

 

Following will be the content of res/layout/activity_main.xml file to include a button to broadcast your custom intent –

<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:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".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="Andro Development "
        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>

 

Keep it in mind that you have following content of res/values/strings.xml file:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">My Application</string>
    <string name="action_settings">Settings</string>
</resources>

 

How about we attempt to run our adjusted My Application application we simply modified. I accept you had made your AVD while doing Android environment setup. To run the application from Android studio, open one of your project activity files and snap Run Android Studio Icon  from the toolbar. Android Studio installs the application on your AVD and begins it and if all is well with your set-up and application, it will show taking after Emulator window. Wait for a few while because it may take some time completely based on your system speed

android content provider

Presently we should enter Student Name and Grade lastly tap on Add Name button, this will include student record in the database and will streak a message at the base indicating android Content Providers(CP) URI alongside record number included the database. This operation makes utilization of our addition() method. How about we repeat this procedure to include a couple of more students in the database of our content provider.

android content provider

When you are finished with including records in the database, now its opportunity to request that Android Content Providers (CP) give us those records back, so how about we click Retrieve Students button which will bring and show every one of the records one by one which is according to our the execution of our query() method.

 

You can compose activities against update and erase operations by giving callback functions in MainActivity.java  and after that change UI to have buttons for update and deleted operations similarly as we have accomplished for include and read operations.

Along these lines you can utilize existing Android Content Providers (CP) like Address Book or you can utilize Android Content Providers (CP) idea in creating decent database arranged applications where you can play out all kind of database operations like read, compose, and erase as clarified above in the example.