Skip to content
geeksforgeeks
  • Tutorials
    • Python
    • Java
    • Data Structures & Algorithms
    • ML & Data Science
    • Interview Corner
    • Programming Languages
    • Web Development
    • CS Subjects
    • DevOps And Linux
    • School Learning
    • Practice Coding Problems
  • Courses
    • DSA to Development
    • Get IBM Certification
    • Newly Launched!
      • Master Django Framework
      • Become AWS Certified
    • For Working Professionals
      • Interview 101: DSA & System Design
      • Data Science Training Program
      • JAVA Backend Development (Live)
      • DevOps Engineering (LIVE)
      • Data Structures & Algorithms in Python
    • For Students
      • Placement Preparation Course
      • Data Science (Live)
      • Data Structure & Algorithm-Self Paced (C++/JAVA)
      • Master Competitive Programming (Live)
      • Full Stack Development with React & Node JS (Live)
    • Full Stack Development
    • Data Science Program
    • All Courses
  • Java Arrays
  • Java Strings
  • Java OOPs
  • Java Collection
  • Java 8 Tutorial
  • Java Multithreading
  • Java Exception Handling
  • Java Programs
  • Java Project
  • Java Collections Interview
  • Java Interview Questions
  • Java MCQs
  • Spring
  • Spring MVC
  • Spring Boot
  • Hibernate
Open In App
Next Article:
Content Providers in Android with Example
Next article icon

Content Providers in Android with Example

Last Updated : 02 Jan, 2025
Comments
Improve
Suggest changes
Like Article
Like
Report

In Android , Content Providers are a very important component that serves the purpose of a relational database to store the data of applications. The role of the content provider in the android system is like a central repository in which data of the applications are stored, and it facilitates other applications to securely access and modifies that data based on the user requirements. Android system allows the content provider to store the application data in several ways. Users can manage to store the application data like images, audio, videos, and personal contact information by storing them in SQLite Database , in files , or even on a network . In order to share the data, content providers have certain permissions that are used to grant or restrict the rights to other applications to interfere with the data.

Content Provider

Content URI

Content URI(Uniform Resource Identifier) is the key concept of Content providers. To access the data from a content provider, URI is used as a query string.

Structure of a Content URI: content://authority/optionalPath/optionalID

Details of different parts of Content URI:

  • content:// - Mandatory part of the URI as it represents that the given URI is a Content URI.
  • authority - Signifies the name of the content provider like contacts, browser, etc. This part must be unique for every content provider.
  • optionalPath - Specifies the type of data provided by the content provider. It is essential as this part helps content providers to support different types of data that are not related to each other like audio and video files.
  • optionalID - It is a numeric value that is used when there is a need to access a particular record.

If an ID is mentioned in a URI then it is an id-based URI otherwise a directory-based URI.

Operations in Content Provider

Four fundamental operations are possible in Content Provider namely Create , Read , Update , and Delete . These operations are often termed as CRUD operations .

  • Create: Operation to create data in a content provider.
  • Read: Used to fetch data from a content provider.
  • Update: To modify existing data.
  • Delete: To remove existing data from the storage.

Working of the Content Provider

UI components of android applications like Activity and Fragments use an object CursorLoader to send query requests to ContentResolver. The ContentResolver object sends requests (like create, read, update, and delete) to the ContentProvider as a client. After receiving a request, ContentProvider process it and returns the desired result. Below is a diagram to represent these processes in pictorial form.

Working of content provider

Creating a Content Provider

Following are the steps which are essential to follow in order to create a Content Provider:

  • Create a class in the same directory where the that MainActivity file resides and this class must extend the ContentProvider base class.
  • To access the content, define a content provider URI address.
  • Create a database to store the application data.
  • Implement the six abstract methods of ContentProvider class.
  • Register the content provider in AndroidManifest.xml file using <provider> tag .

Following are the six abstract methods and their description which are essential to override as the part of ContenProvider class:

Abstract Method

Description

query()

A method that accepts arguments and fetches the data from the

desired table. Data is retired as a cursor object.

insert()

To insert a new row in the database of the content provider.

It returns the content URI of the inserted row.

update()

This method is used to update the fields of an existing row.

It returns the number of rows updated.

delete()

This method is used to delete the existing rows.

It returns the number of rows deleted.

getType()

This method returns the Multipurpose Internet Mail Extension(MIME)

type of data to the given Content URI.

onCreate()

As the content provider is created, the android system calls

this method immediately to initialise the provider.

Example

The prime purpose of a content provider is to serve as a central repository of data where users can store and can fetch the data. The access of this repository is given to other applications also but in a safe manner in order to serve the different requirements of the user. The following are the steps involved in implementing a content provider. In this content provider, the user can store the name of persons and can fetch the stored data. Moreover, another application can also access the stored data and can display the data.

Note: Following steps are performed on Android Studio version 4.0

Creating a Content Provider:

Step 1: Create a new project

  1. Click on File, then New => New Project.
  2. Select language as Java/Kotlin.
  3. Choose empty activity as a template
  4. Select the minimum SDK as per your need.

Step 2: Modify the strings.xml file

All the strings used in the activity are stored here.

XML
<resources>     <string name="app_name">Content_Provider_In_Android</string>     <string name="hintText">Enter User Name</string>     <string name="heading">Content Provider In Android</string>     <string name="insertButtontext">Insert Data</string>     <string name="loadButtonText">Load Data</string> </resources> 

Step 3: Creating the Content Provider class

  1. Click on File, then New => Other => ContentProvider.
  2. Name the ContentProvider
  3. Define authority (it can be anything for example "com.demo.user.provider" )
  4. Select Exported and Enabled option
  5. Choose the language as Java/Kotlin

This class extends the ContentProvider base class and override the six abstract methods. Below is the complete code to define a content provider.

Java
package com.example.contentprovidersinandroid;  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.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteQueryBuilder; import android.net.Uri; import java.util.HashMap;  public class MyContentProvider extends ContentProvider {     public MyContentProvider() {     }      // defining authority so that other application can access it     static final String PROVIDER_NAME = "com.demo.user.provider";      // defining content URI     static final String URL = "content://" + PROVIDER_NAME + "/users";      // parsing the content URI     static final Uri CONTENT_URI = Uri.parse(URL);      static final String id = "id";     static final String name = "name";     static final int uriCode = 1;     static final UriMatcher uriMatcher;     private static HashMap<String, String> values;      static {          // to match the content URI         // every time user access table under content provider         uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);          // to access whole table         uriMatcher.addURI(PROVIDER_NAME, "users", uriCode);          // to access a particular row         // of the table         uriMatcher.addURI(PROVIDER_NAME, "users/*", uriCode);     }     @Override     public String getType(Uri uri) {         switch (uriMatcher.match(uri)) {             case uriCode:                 return "vnd.android.cursor.dir/users";             default:                 throw new IllegalArgumentException("Unsupported URI: " + uri);         }     }       // creating the database     @Override     public boolean onCreate() {         Context context = getContext();         DatabaseHelper dbHelper = new DatabaseHelper(context);         db = dbHelper.getWritableDatabase();         if (db != null) {             return true;         }         return false;     }     @Override     public Cursor query(Uri uri, String[] projection, String selection,                         String[] selectionArgs, String sortOrder) {         SQLiteQueryBuilder qb = new SQLiteQueryBuilder();         qb.setTables(TABLE_NAME);         switch (uriMatcher.match(uri)) {             case uriCode:                 qb.setProjectionMap(values);                 break;             default:                 throw new IllegalArgumentException("Unknown URI " + uri);         }         if (sortOrder == null || sortOrder == "") {             sortOrder = id;         }         Cursor c = qb.query(db, projection, selection, selectionArgs, null,                 null, sortOrder);         c.setNotificationUri(getContext().getContentResolver(), uri);         return c;     }        // adding data to the database     @Override         public Uri insert(Uri uri, ContentValues values) {         long rowID = db.insert(TABLE_NAME, "", values);         if (rowID > 0) {             Uri _uri = ContentUris.withAppendedId(CONTENT_URI, rowID);             getContext().getContentResolver().notifyChange(_uri, null);             return _uri;         }         throw new SQLiteException("Failed to add a record into " + uri);     }      @Override     public int update(Uri uri, ContentValues values, String selection,                       String[] selectionArgs) {         int count = 0;         switch (uriMatcher.match(uri)) {             case uriCode:                 count = db.update(TABLE_NAME, values, selection, selectionArgs);                 break;             default:                 throw new IllegalArgumentException("Unknown URI " + uri);         }         getContext().getContentResolver().notifyChange(uri, null);         return count;     }      @Override     public int delete(Uri uri, String selection, String[] selectionArgs) {         int count = 0;         switch (uriMatcher.match(uri)) {             case uriCode:                 count = db.delete(TABLE_NAME, selection, selectionArgs);                 break;             default:                 throw new IllegalArgumentException("Unknown URI " + uri);         }         getContext().getContentResolver().notifyChange(uri, null);         return count;     }      // creating object of database     // to perform query     private SQLiteDatabase db;      // declaring name of the database     static final String DATABASE_NAME = "UserDB";      // declaring table name of the database     static final String TABLE_NAME = "Users";      // declaring version of the database     static final int DATABASE_VERSION = 1;      // sql query to create the table     static final String CREATE_DB_TABLE = " CREATE TABLE " + TABLE_NAME             + " (id INTEGER PRIMARY KEY AUTOINCREMENT, "             + " name TEXT NOT NULL);";      // creating a database     private static class DatabaseHelper extends SQLiteOpenHelper {          // defining a constructor         DatabaseHelper(Context context) {             super(context, DATABASE_NAME, null, DATABASE_VERSION);         }           // creating a table in the database         @Override         public void onCreate(SQLiteDatabase db) {              db.execSQL(CREATE_DB_TABLE);         }          @Override         public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {              // sql query to drop a table             // having similar name             db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);             onCreate(db);         }     } } 
Kotlin
package com.example.contentprovidersinandroid  import android.content.* import android.database.Cursor import android.database.sqlite.SQLiteDatabase import android.database.sqlite.SQLiteException import android.database.sqlite.SQLiteOpenHelper import android.database.sqlite.SQLiteQueryBuilder import android.net.Uri   class MyContentProvider : ContentProvider() {     companion object {         // defining authority so that other application can access it         const val PROVIDER_NAME = "com.demo.user.provider"          // defining content URI         const val URL = "content://$PROVIDER_NAME/users"          // parsing the content URI         val CONTENT_URI = Uri.parse(URL)         const val id = "id"         const val name = "name"         const val uriCode = 1         var uriMatcher: UriMatcher? = null         private val values: HashMap<String, String>? = null          // declaring name of the database         const val DATABASE_NAME = "UserDB"          // declaring table name of the database         const val TABLE_NAME = "Users"          // declaring version of the database         const val DATABASE_VERSION = 1          // sql query to create the table         const val CREATE_DB_TABLE =             (" CREATE TABLE " + TABLE_NAME                     + " (id INTEGER PRIMARY KEY AUTOINCREMENT, "                     + " name TEXT NOT NULL);")          init {              // to match the content URI             // every time user access table under content provider             uriMatcher = UriMatcher(UriMatcher.NO_MATCH)              // to access whole table             uriMatcher!!.addURI(                 PROVIDER_NAME,                 "users",                 uriCode             )              // to access a particular row             // of the table             uriMatcher!!.addURI(                 PROVIDER_NAME,                 "users/*",                 uriCode             )         }     }      override fun getType(uri: Uri): String? {         return when (uriMatcher!!.match(uri)) {             uriCode -> "vnd.android.cursor.dir/users"             else -> throw IllegalArgumentException("Unsupported URI: $uri")         }     }      // creating the database     override fun onCreate(): Boolean {         val context = context         val dbHelper =             DatabaseHelper(context)         db = dbHelper.writableDatabase         return if (db != null) {             true         } else false     }      override fun query(         uri: Uri, projection: Array<String>?, selection: String?,         selectionArgs: Array<String>?, sortOrder: String?     ): Cursor? {         var sortOrder = sortOrder         val qb = SQLiteQueryBuilder()         qb.tables = TABLE_NAME         when (uriMatcher!!.match(uri)) {             uriCode -> qb.projectionMap = values             else -> throw IllegalArgumentException("Unknown URI $uri")         }         if (sortOrder == null || sortOrder === "") {             sortOrder = id         }         val c = qb.query(             db, projection, selection, selectionArgs, null,             null, sortOrder         )         c.setNotificationUri(context!!.contentResolver, uri)         return c     }      // adding data to the database     override fun insert(uri: Uri, values: ContentValues?): Uri? {         val rowID = db!!.insert(TABLE_NAME, "", values)         if (rowID > 0) {             val _uri =                 ContentUris.withAppendedId(CONTENT_URI, rowID)             context!!.contentResolver.notifyChange(_uri, null)             return _uri         }         throw SQLiteException("Failed to add a record into $uri")     }      override fun update(         uri: Uri, values: ContentValues?, selection: String?,         selectionArgs: Array<String>?     ): Int {         var count = 0         count = when (uriMatcher!!.match(uri)) {             uriCode -> db!!.update(TABLE_NAME, values, selection, selectionArgs)             else -> throw IllegalArgumentException("Unknown URI $uri")         }         context!!.contentResolver.notifyChange(uri, null)         return count     }      override fun delete(         uri: Uri,         selection: String?,         selectionArgs: Array<String>?     ): Int {         var count = 0         count = when (uriMatcher!!.match(uri)) {             uriCode -> db!!.delete(TABLE_NAME, selection, selectionArgs)             else -> throw IllegalArgumentException("Unknown URI $uri")         }         context!!.contentResolver.notifyChange(uri, null)         return count     }      // creating object of database     // to perform query     private var db: SQLiteDatabase? = null      // creating a database     private class DatabaseHelper  // defining a constructor     internal constructor(context: Context?) : SQLiteOpenHelper(         context,         DATABASE_NAME,         null,         DATABASE_VERSION     ) {         // creating a table in the database         override fun onCreate(db: SQLiteDatabase) {             db.execSQL(CREATE_DB_TABLE)         }          override fun onUpgrade(             db: SQLiteDatabase,             oldVersion: Int,             newVersion: Int         ) {              // sql query to drop a table             // having similar name             db.execSQL("DROP TABLE IF EXISTS $TABLE_NAME")             onCreate(db)         }     } } 

Step 4: Design the activity_main.xml layout

One Textview , EditText field, two Buttons , and a Textview to display the stored data will be added in the activity using the below code.

XML
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout     xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:app="http://schemas.android.com/apk/res-auto"     xmlns:tools="http://schemas.android.com/tools"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:background="#168BC34A"     tools:context=".MainActivity">      <LinearLayout         android:id="@+id/linearLayout"         android:layout_width="match_parent"         android:layout_height="wrap_content"         android:layout_centerVertical="true"         android:orientation="vertical"         app:layout_constraintBottom_toTopOf="@+id/imageView"         app:layout_constraintEnd_toEndOf="parent"         app:layout_constraintStart_toStartOf="parent"         app:layout_constraintTop_toTopOf="parent"         app:layout_constraintVertical_bias="0.13"         tools:ignore="MissingConstraints">          <TextView             android:id="@+id/textView1"             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:layout_marginTop="40dp"             android:layout_marginBottom="70dp"             android:fontFamily="@font/roboto"             android:text="@string/heading"             android:textAlignment="center"             android:textAppearance="@style/TextAppearance.AppCompat.Large"             android:textColor="@android:color/holo_green_dark"             android:textSize="36sp"             android:textStyle="bold" />          <EditText             android:id="@+id/textName"             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:layout_marginStart="20dp"             android:layout_marginEnd="20dp"             android:layout_marginBottom="40dp"             android:fontFamily="@font/roboto"             android:hint="@string/hintText" />          <Button             android:id="@+id/insertButton"             android:layout_width="match_parent"             android:layout_height="match_parent"             android:layout_marginStart="20dp"             android:layout_marginTop="10dp"             android:layout_marginEnd="20dp"             android:layout_marginBottom="20dp"             android:background="#4CAF50"             android:fontFamily="@font/roboto"             android:onClick="onClickAddDetails"             android:text="@string/insertButtontext"             android:textAlignment="center"             android:textAppearance="@style/TextAppearance.AppCompat.Display1"             android:textColor="#FFFFFF"             android:textStyle="bold" />          <Button             android:id="@+id/loadButton"             android:layout_width="match_parent"             android:layout_height="match_parent"             android:layout_marginStart="20dp"             android:layout_marginTop="10dp"             android:layout_marginEnd="20dp"             android:layout_marginBottom="20dp"             android:background="#4CAF50"             android:fontFamily="@font/roboto"             android:onClick="onClickShowDetails"             android:text="@string/loadButtonText"             android:textAlignment="center"             android:textAppearance="@style/TextAppearance.AppCompat.Display1"             android:textColor="#FFFFFF"             android:textStyle="bold" />          <TextView             android:id="@+id/res"             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:layout_marginStart="20dp"             android:layout_marginEnd="20dp"             android:clickable="false"             android:ems="10"             android:fontFamily="@font/roboto"             android:textColor="@android:color/holo_green_dark"             android:textSize="18sp"             android:textStyle="bold" />      </LinearLayout>      <ImageView         android:id="@+id/imageView"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         app:layout_constraintBottom_toBottomOf="parent"         app:layout_constraintEnd_toEndOf="parent"         app:layout_constraintStart_toStartOf="parent"         app:srcCompat="@drawable/banner" />  </androidx.constraintlayout.widget.ConstraintLayout> 

Step 5: Modify the MainActivity file

Button functionalities will be defined in this file. Moreover, the query to be performed while inserting and fetching the data is mentioned here. Below is the complete code.

Java
package com.example.contentprovidersinandroid;  import androidx.appcompat.app.AppCompatActivity;  import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast;  public class MainActivity extends AppCompatActivity {      @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);     }      @Override     public boolean onTouchEvent(MotionEvent event) {         InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);         imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);         return true;     }     public void onClickAddDetails(View view) {          // class to add values in the database         ContentValues values = new ContentValues();          // fetching text from user         values.put(MyContentProvider.name, ((EditText) findViewById(R.id.textName)).getText().toString());          // inserting into database through content URI         getContentResolver().insert(MyContentProvider.CONTENT_URI, values);          // displaying a toast message         Toast.makeText(getBaseContext(), "New Record Inserted", Toast.LENGTH_LONG).show();     }      public void onClickShowDetails(View view) {         // inserting complete table details in this text field         TextView resultView= (TextView) findViewById(R.id.res);          // creating a cursor object of the         // content URI         Cursor cursor = getContentResolver().query(Uri.parse("content://com.demo.user.provider/users"), null, null, null, null);          // iteration of the cursor         // to print whole table         if(cursor.moveToFirst()) {             StringBuilder strBuild=new StringBuilder();             while (!cursor.isAfterLast()) {                 strBuild.append("\n"+cursor.getString(cursor.getColumnIndex("id"))+ "-"+ cursor.getString(cursor.getColumnIndex("name")));                 cursor.moveToNext();             }             resultView.setText(strBuild);         }         else {             resultView.setText("No Records Found");         }     } } 
Kotlin
package com.example.content_provider_in_android  import android.content.ContentValues import android.content.Context import android.net.Uri import android.os.Bundle import android.view.MotionEvent import android.view.View import android.view.inputmethod.InputMethodManager import android.widget.EditText import android.widget.TextView import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import com.example.contentprovidersinandroid.MyContentProvider   class MainActivity : AppCompatActivity() {     override fun onCreate(savedInstanceState: Bundle?) {         super.onCreate(savedInstanceState)         setContentView(R.layout.activity_main)     }      override fun onTouchEvent(event: MotionEvent?): Boolean {         val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager         imm.hideSoftInputFromWindow(currentFocus!!.windowToken, 0)         return true     }      fun onClickAddDetails(view: View?) {          // class to add values in the database         val values = ContentValues()          // fetching text from user         values.put(MyContentProvider.name, (findViewById<View>(R.id.textName) as EditText).text.toString())          // inserting into database through content URI         contentResolver.insert(MyContentProvider.CONTENT_URI, values)          // displaying a toast message         Toast.makeText(baseContext, "New Record Inserted", Toast.LENGTH_LONG).show()     }      fun onClickShowDetails(view: View?) {         // inserting complete table details in this text field         val resultView = findViewById<View>(R.id.res) as TextView          // creating a cursor object of the         // content URI         val cursor = contentResolver.query(Uri.parse("content://com.demo.user.provider/users"), null, null, null, null)          // iteration of the cursor         // to print whole table         if (cursor!!.moveToFirst()) {             val strBuild = StringBuilder()             while (!cursor.isAfterLast) {                 strBuild.append("""          ${cursor.getString(cursor.getColumnIndex("id"))}-${cursor.getString(cursor.getColumnIndex("name"))}     """.trimIndent())                 cursor.moveToNext()             }             resultView.text = strBuild         } else {             resultView.text = "No Records Found"         }     } } 

Step 6: Modify the AndroidManifest file

The AndroidManifest file must contain the content provider name, authorities, and permissions which enable the content provider to be accessed by other applications.

XML
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"     package="com.example.content_provider_in_android">      <application         android:allowBackup="true"         android:icon="@mipmap/ic_launcher"         android:label="@string/app_name"         android:roundIcon="@mipmap/ic_launcher_round"         android:supportsRtl="true"         android:theme="@style/AppTheme">         <provider             android:name="com.example.contentprovidersinandroid.MyContentProvider"             android:authorities="com.demo.user.provider"             android:enabled="true"             android:exported="true"></provider>          <activity android:name=".MainActivity">             <intent-filter>                 <action android:name="android.intent.action.MAIN" />                  <category android:name="android.intent.category.LAUNCHER" />             </intent-filter>         </activity>         <meta-data             android:name="preloaded_fonts"             android:resource="@array/preloaded_fonts" />     </application>  </manifest> 

Creating another application to access the Content Provider:

Step 1: Create a new Project

  1. Click on File, then New => New Project.
  2. Select language as Java/Kotlin.
  3. Choose empty activity as a template
  4. Select the minimum SDK as per your need.

Step 2: Modify strings.xml file

All the strings used in the activity are stored in this file.

XML
<resources>     <string name="app_name">Accessing_Content_Provider</string>     <string name="heading">Accessing data of Content Provider</string>     <string name="loadButtonText">Load Data</string> </resources> 

Step 3: Designing the activity_main.xml layout

Two TextView are added in the activity, one for heading and one to display the stored data in a content provider. One Button is also added to receive the command to display data. Below is the code to implement this design.

XML
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout     xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:app="http://schemas.android.com/apk/res-auto"     xmlns:tools="http://schemas.android.com/tools"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:background="#168BC34A"     tools:context=".MainActivity">      <LinearLayout         android:id="@+id/linearLayout"         android:layout_width="match_parent"         android:layout_height="wrap_content"         android:layout_centerVertical="true"         android:orientation="vertical"         app:layout_constraintBottom_toTopOf="@+id/imageView"         app:layout_constraintEnd_toEndOf="parent"         app:layout_constraintStart_toStartOf="parent"         app:layout_constraintTop_toTopOf="parent"         app:layout_constraintVertical_bias="0.13"         tools:ignore="MissingConstraints">          <TextView             android:id="@+id/textView1"             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:layout_marginTop="40dp"             android:layout_marginBottom="70dp"             android:fontFamily="@font/roboto"             android:text="@string/heading"             android:textAlignment="center"             android:textAppearance="@style/TextAppearance.AppCompat.Large"             android:textColor="@android:color/holo_green_dark"             android:textSize="36sp"             android:textStyle="bold" />           <Button             android:id="@+id/loadButton"             android:layout_width="match_parent"             android:layout_height="match_parent"             android:layout_marginStart="20dp"             android:layout_marginTop="10dp"             android:layout_marginEnd="20dp"             android:layout_marginBottom="20dp"             android:background="#4CAF50"             android:fontFamily="@font/roboto"             android:onClick="onClickShowDetails"             android:text="@string/loadButtonText"             android:textAlignment="center"             android:textAppearance="@style/TextAppearance.AppCompat.Display1"             android:textColor="#FFFFFF"             android:textStyle="bold" />          <TextView             android:id="@+id/res"             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:layout_marginStart="20dp"             android:layout_marginEnd="20dp"             android:clickable="false"             android:ems="10"             android:fontFamily="@font/roboto"             android:textColor="@android:color/holo_green_dark"             android:textSize="18sp"             android:textStyle="bold" />      </LinearLayout>      <ImageView         android:id="@+id/imageView"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         app:layout_constraintBottom_toBottomOf="parent"         app:layout_constraintEnd_toEndOf="parent"         app:layout_constraintStart_toStartOf="parent"         app:srcCompat="@drawable/banner" />  </androidx.constraintlayout.widget.ConstraintLayout> 

Step 4: Modify the MainActivity file

The ContentURI of the previous application is mentioned here and the same functions which were used in the previous app to display the records will also be used here. Below is the complete code:

Java
package com.example.accessingcontentprovider;  import androidx.appcompat.app.AppCompatActivity; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.widget.TextView;   public class MainActivity extends AppCompatActivity {      Uri CONTENT_URI = Uri.parse("content://com.demo.user.provider/users");       @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);     }      public void onClickShowDetails(View view) {         // inserting complete table details in this text field         TextView resultView= (TextView) findViewById(R.id.res);          // creating a cursor object of the         // content URI         Cursor cursor = getContentResolver().query(Uri.parse("content://com.demo.user.provider/users"), null, null, null, null);          // iteration of the cursor         // to print whole table         if(cursor.moveToFirst()) {             StringBuilder strBuild=new StringBuilder();             while (!cursor.isAfterLast()) {                 strBuild.append("\n"+cursor.getString(cursor.getColumnIndex("id"))+ "-"+ cursor.getString(cursor.getColumnIndex("name")));                 cursor.moveToNext();             }             resultView.setText(strBuild);         }         else {             resultView.setText("No Records Found");         }     } } 
Kotlin
package com.example.accessing_content_provider  import android.net.Uri import android.os.Bundle import android.view.View import android.widget.TextView import androidx.appcompat.app.AppCompatActivity  class MainActivity : AppCompatActivity() {     var CONTENT_URI = Uri.parse("content://com.demo.user.provider/users")       override fun onCreate(savedInstanceState: Bundle?) {         super.onCreate(savedInstanceState)         setContentView(R.layout.activity_main)     }      fun onClickShowDetails(view: View?) {         // inserting complete table details in this text field         val resultView = findViewById<View>(R.id.res) as TextView          // creating a cursor object of the         // content URI         val cursor = contentResolver.query(Uri.parse("content://com.demo.user.provider/users"), null, null, null, null)          // iteration of the cursor         // to print whole table         if (cursor!!.moveToFirst()) {             val strBuild = StringBuilder()             while (!cursor.isAfterLast) {                 strBuild.append("""          ${cursor.getString(cursor.getColumnIndex("id"))}-${cursor.getString(cursor.getColumnIndex("name"))}     """.trimIndent())                 cursor.moveToNext()             }             resultView.text = strBuild         } else {             resultView.text = "No Records Found"         }     } } 

Output: Run on Emulator

Step 5: Modify the AndroidManifest.xml file

Don't forget to add <query> permission (API 30 and above).

For more details refer here .

XML
<queries>     <package android:name="com.example.contentprovidersinandroid"/> </queries> <application> . . . </application> 

Next Article
Content Providers in Android with Example

R

RISHU_MISHRA
Improve
Article Tags :
  • Java
  • Kotlin
  • Android
Practice Tags :
  • Java

Similar Reads

    Context Menu in Android with Example
    In Android, there are three types of menus available to define a set of options and actions in the Android apps. Here in this article let's discuss the detail of the Context Menu. In Android, the context menu is like a floating menu and arises when the user has long-pressed or clicked on an item and
    4 min read
    EditText widget in Android with Example
    Widget refers to the elements of the UI (User Interface) that helps user interacts with the Android App. EditText is one of many such widgets which can be used to retrieve text data from user.EditText refers to the widget that displays an empty text field in which a user can enter the required text
    4 min read
    TextView in Android with Example
    TextView is a simple widget that is seen in every android application. This widget is used to display simple text within the android application. We can add custom styling to the text that we have to show. In this article, we will take a look at How to create a simple Text View in an android applica
    2 min read
    OpenIntents in Android with Example
    OI refers to the "OpenIntents" project in Android are a way for one app to request an action from another app. This can be done using either explicit or implicit intents, allowing them to share functionality. The OpenIntents project provides a set of commonly-used intents that can be used by develop
    4 min read
    Deep Linking in Android with Example
    Deep Linking is one of the most important features that is used by various apps to gather data inside their apps in the form of a URL link. So it becomes helpful for the users from other apps to easily share the data with different apps. In this article, we will take a look at the implementation of
    7 min read
geeksforgeeks-footer-logo
Corporate & Communications Address:
A-143, 7th Floor, Sovereign Corporate Tower, Sector- 136, Noida, Uttar Pradesh (201305)
Registered Address:
K 061, Tower K, Gulshan Vivante Apartment, Sector 137, Noida, Gautam Buddh Nagar, Uttar Pradesh, 201305
GFG App on Play Store GFG App on App Store
Advertise with us
  • Company
  • About Us
  • Legal
  • Privacy Policy
  • In Media
  • Contact Us
  • Advertise with us
  • GFG Corporate Solution
  • Placement Training Program
  • Languages
  • Python
  • Java
  • C++
  • PHP
  • GoLang
  • SQL
  • R Language
  • Android Tutorial
  • Tutorials Archive
  • DSA
  • Data Structures
  • Algorithms
  • DSA for Beginners
  • Basic DSA Problems
  • DSA Roadmap
  • Top 100 DSA Interview Problems
  • DSA Roadmap by Sandeep Jain
  • All Cheat Sheets
  • Data Science & ML
  • Data Science With Python
  • Data Science For Beginner
  • Machine Learning
  • ML Maths
  • Data Visualisation
  • Pandas
  • NumPy
  • NLP
  • Deep Learning
  • Web Technologies
  • HTML
  • CSS
  • JavaScript
  • TypeScript
  • ReactJS
  • NextJS
  • Bootstrap
  • Web Design
  • Python Tutorial
  • Python Programming Examples
  • Python Projects
  • Python Tkinter
  • Python Web Scraping
  • OpenCV Tutorial
  • Python Interview Question
  • Django
  • Computer Science
  • Operating Systems
  • Computer Network
  • Database Management System
  • Software Engineering
  • Digital Logic Design
  • Engineering Maths
  • Software Development
  • Software Testing
  • DevOps
  • Git
  • Linux
  • AWS
  • Docker
  • Kubernetes
  • Azure
  • GCP
  • DevOps Roadmap
  • System Design
  • High Level Design
  • Low Level Design
  • UML Diagrams
  • Interview Guide
  • Design Patterns
  • OOAD
  • System Design Bootcamp
  • Interview Questions
  • Inteview Preparation
  • Competitive Programming
  • Top DS or Algo for CP
  • Company-Wise Recruitment Process
  • Company-Wise Preparation
  • Aptitude Preparation
  • Puzzles
  • School Subjects
  • Mathematics
  • Physics
  • Chemistry
  • Biology
  • Social Science
  • English Grammar
  • Commerce
  • World GK
  • GeeksforGeeks Videos
  • DSA
  • Python
  • Java
  • C++
  • Web Development
  • Data Science
  • CS Subjects
@GeeksforGeeks, Sanchhaya Education Private Limited, All rights reserved
We use cookies to ensure you have the best browsing experience on our website. By using our site, you acknowledge that you have read and understood our Cookie Policy & Privacy Policy
Lightbox
Improvement
Suggest Changes
Help us improve. Share your suggestions to enhance the article. Contribute your expertise and make a difference in the GeeksforGeeks portal.
geeksforgeeks-suggest-icon
Create Improvement
Enhance the article with your expertise. Contribute to the GeeksforGeeks community and help create better learning resources for all.
geeksforgeeks-improvement-icon
Suggest Changes
min 4 words, max Words Limit:1000

Thank You!

Your suggestions are valuable to us.

What kind of Experience do you want to share?

Interview Experiences
Admission Experiences
Career Journeys
Work Experiences
Campus Experiences
Competitive Exam Experiences