{"id":6689,"date":"2021-03-25T16:29:19","date_gmt":"2021-03-25T10:59:19","guid":{"rendered":"https:\/\/www.innovationm.com\/blog\/?p=6689"},"modified":"2021-03-25T16:33:24","modified_gmt":"2021-03-25T11:03:24","slug":"content-provider-in-android","status":"publish","type":"post","link":"https:\/\/www.innovationm.com\/blog\/content-provider-in-android\/","title":{"rendered":"Content Provider in Android"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">A content provider manages access to a central repository of data. A provider is part of an Android application, which often provides its own UI for working with the data. However, content providers are primarily intended to be used by other applications, which access the provider using a provider-client object.<\/span><\/p>\n<h2><b>How to use a Content provider in Application<\/b><\/h2>\n<p><span style=\"font-weight: 400;\">We use content providers for accessing, sharing the data among the applications.<\/span><b><\/b><\/p>\n<p><strong>1- Accessing the Provider<\/strong><\/p>\n<p><span style=\"font-weight: 400;\">When you want to access data in a content provider, you use the ContentResolver object in your application&#8217;s Context to communicate with the provider as a client.<\/span><\/p>\n<p><strong>2- Register the provider class in Manifest.xml<\/strong><\/p>\n<pre class=\"lang:default decode:true\">&lt;provider\r\n\r\n\u00a0\u00a0\u00a0android:authorities=\"learnprogramming.academy.tasktimer.provider\"\r\n\r\n\u00a0\u00a0\u00a0android:name=\"learnprogramming.academy.tasktimer.AppProvider\"\r\n\r\n\u00a0\u00a0\u00a0android:exported=\"false\"\/&gt;\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>3- Create a model class for the data<\/strong><\/p>\n<pre class=\"lang:default decode:true\">@Parcelize\r\n\r\ndata class Task(val name: String, val description: String, val sortOrder: Int, var id: Long = 0) : Parcelable {\r\n\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>4- Create an object class\u00a0<\/strong><\/p>\n<pre class=\"lang:default decode:true\">object TasksContract {\r\n\r\n\u00a0\u00a0\u00a0internal const val TABLE_NAME = \"Tasks\"\r\n\r\n\u00a0\u00a0\u00a0\/**\r\n\r\n\u00a0\u00a0\u00a0\u00a0* The URI to access the Tasks table.\r\n\r\n\u00a0\u00a0\u00a0\u00a0*\/\r\n\r\n\u00a0\u00a0\u00a0val CONTENT_URI: Uri = Uri.withAppendedPath(CONTENT_AUTHORITY_URI, TABLE_NAME)\r\n\r\n\r\n\u00a0\u00a0\u00a0const val CONTENT_TYPE = \"vnd.android.cursor.dir\/vnd.$CONTENT_AUTHORITY.$TABLE_NAME\"\r\n\r\n\u00a0\u00a0\u00a0const val CONTENT_ITEM_TYPE = \"vnd.android.cursor.item\/vnd.$CONTENT_AUTHORITY.$TABLE_NAME\"\r\n\r\n\r\n\r\n\u00a0\u00a0\u00a0\/\/ Tasks fields\r\n\r\n\u00a0\u00a0\u00a0object Columns {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0const val ID = BaseColumns._ID\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0const val TASK_NAME = \"Name\"\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0const val TASK_DESCRIPTION = \"Description\"\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0const val TASK_SORT_ORDER = \"SortOrder\"\r\n\r\n\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0fun getId(uri: Uri): Long {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return ContentUris.parseId(uri)\r\n\r\n\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0fun buildUriFromId(id: Long): Uri {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return ContentUris.withAppendedId(CONTENT_URI, id)\r\n\r\n\u00a0\u00a0\u00a0}\r\n\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>5- Create a provider class<\/strong><\/p>\n<pre class=\"lang:default decode:true\">const val CONTENT_AUTHORITY = \"learnprogramming.academy.tasktimer.provider\"\r\n\r\nval CONTENT_AUTHORITY_URI: Uri = Uri.parse(\"content:\/\/$CONTENT_AUTHORITY\")\r\n\r\nprivate const val TASKS = 100\r\n\r\nprivate const val TASKS_ID = 101\r\n\r\nclass AppProvider: ContentProvider() {\r\n\r\n\u00a0\u00a0\u00a0private val uriMatcher by lazy { buildUriMatcher() }\r\n\r\n\u00a0\u00a0\u00a0private fun buildUriMatcher() : UriMatcher {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Log.d(TAG, \"buildUriMatcher: starts\")\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0val matcher = UriMatcher(UriMatcher.NO_MATCH)\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ e.g. content:\/\/learnprogramming.academy.tasktimer.provider\/Tasks\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0matcher.addURI(CONTENT_AUTHORITY, TasksContract.TABLE_NAME, TASKS)\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ e.g. content:\/\/learnprogramming.academy.tasktimer.provider\/Tasks\/8\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0matcher.addURI(CONTENT_AUTHORITY, \"${TasksContract.TABLE_NAME}\/#\", TASKS_ID)\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return matcher\r\n\r\n\u00a0\u00a0\u00a0}\r\n\r\n\u00a0override fun onCreate(): Boolean {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Log.d(TAG, \"onCreate: starts\")\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return true\r\n\r\n\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0override fun getType(uri: Uri): String {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0val match = uriMatcher.match(uri)\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return when (match) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0TASKS -&gt; TasksContract.CONTENT_TYPE\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0TASKS_ID -&gt; TasksContract.CONTENT_ITEM_TYPE\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0else -&gt; throw IllegalArgumentException(\"unknown Uri: $uri\")\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0}\r\n\r\n\r\n\u00a0\u00a0\u00a0override fun query(uri: Uri, projection: Array&lt;out String&gt;?, selection: String?, selectionArgs: Array&lt;out String&gt;?,\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0sortOrder: String?): Cursor {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Log.d(TAG, \"query: called with uri $uri\")\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0val match = uriMatcher.match(uri)\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Log.d(TAG, \"query: match is $match\")\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0val queryBuilder = SQLiteQueryBuilder()\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0when (match) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0TASKS -&gt; queryBuilder.tables = TasksContract.TABLE_NAME\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0TASKS_ID -&gt; {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0queryBuilder.tables = TasksContract.TABLE_NAME\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0val taskId = TasksContract.getId(uri)\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0queryBuilder.appendWhere(\"${TasksContract.Columns.ID} = \")\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0queryBuilder.appendWhereEscapeString(\"$taskId\")\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0else -&gt; throw IllegalArgumentException(\"Unknown URI: $uri\")\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0val db = AppDatabase.getInstance(context).readableDatabase\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0val cursor = queryBuilder.query(db, projection, selection, selectionArgs, null, null, sortOrder)\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Log.d(TAG, \"query: rows in returned cursor = ${cursor.count}\") \/\/ TODO remove this line\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return cursor\r\n\r\n\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0override fun insert(uri: Uri, values: ContentValues): Uri {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Log.d(TAG, \"insert: called with uri $uri\")\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0val match = uriMatcher.match(uri)\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Log.d(TAG, \"insert: match is $match\")\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0val recordId: Long\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0val returnUri: Uri\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0when(match) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0TASKS -&gt; {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0val db = AppDatabase.getInstance(context).writableDatabase\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0recordId = db.insert(TasksContract.TABLE_NAME, null, values)\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if(recordId != -1L) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0returnUri = TasksContract.buildUriFromId(recordId)\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} else {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0throw SQLException(\"Failed to insert, Uri was $uri\")\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0else -&gt; throw IllegalArgumentException(\"Unknown uri: $uri\")\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (recordId &gt; 0) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ something was inserted\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Log.d(TAG, \"insert: Setting notifyChange with $uri\")\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0context?.contentResolver?.notifyChange(uri, null)\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Log.d(TAG, \"Exiting insert, returning $returnUri\")\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return returnUri\r\n\r\n\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0override fun update(uri: Uri, values: ContentValues, selection: String?, selectionArgs: Array&lt;out String&gt;?): Int {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Log.d(TAG, \"update: called with uri $uri\")\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0val match = uriMatcher.match(uri)\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Log.d(TAG, \"update: match is $match\")\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0val count: Int\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var selectionCriteria: String\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0when(match) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0TASKS -&gt; {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0val db = AppDatabase.getInstance(context).writableDatabase\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0count = db.update(TasksContract.TABLE_NAME, values, selection, selectionArgs)\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0TASKS_ID -&gt; {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0val db = AppDatabase.getInstance(context).writableDatabase\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0val id = TasksContract.getId(uri)\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0selectionCriteria = \"${TasksContract.Columns.ID} = $id\"\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if(selection != null &amp;&amp; selection.isNotEmpty()) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0selectionCriteria += \" AND ($selection)\"\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0count = db.update(TasksContract.TABLE_NAME, values, selectionCriteria, selectionArgs)\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0else -&gt; throw IllegalArgumentException(\"Unknown uri: $uri\")\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (count &gt; 0) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ something was updated\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Log.d(TAG, \"update: Setting notifyChange with $uri\")\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0context?.contentResolver?.notifyChange(uri, null)\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Log.d(TAG, \"Exiting update, returning $count\")\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return count\r\n\r\n\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0override fun delete(uri: Uri, selection: String?, selectionArgs: Array&lt;out String&gt;?): Int {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Log.d(TAG, \"delete: called with uri $uri\")\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0val match = uriMatcher.match(uri)\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Log.d(TAG, \"delete: match is $match\")\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0val count: Int\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var selectionCriteria: String\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0when(match) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0TASKS -&gt; {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0val db = AppDatabase.getInstance(context).writableDatabase\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0count = db.delete(TasksContract.TABLE_NAME, selection, selectionArgs)\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0TASKS_ID -&gt; {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0val db = AppDatabase.getInstance(context).writableDatabase\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0val id = TasksContract.getId(uri)\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0selectionCriteria = \"${TasksContract.Columns.ID} = $id\"\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if(selection != null &amp;&amp; selection.isNotEmpty()) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0selectionCriteria += \" AND ($selection)\"\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0count = db.delete(TasksContract.TABLE_NAME, selectionCriteria, selectionArgs)\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0else -&gt; throw IllegalArgumentException(\"Unknown uri: $uri\")\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (count &gt; 0) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ something was deleted\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Log.d(TAG, \"delete: Setting notifyChange with $uri\")\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0context?.contentResolver?.notifyChange(uri, null)\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Log.d(TAG, \"Exiting delete, returning $count\")\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return count\r\n\r\n\u00a0\u00a0\u00a0}\r\n\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>6- When we want to store the data in the content provider<\/strong><\/p>\n<pre class=\"lang:default decode:true\">fun saveTask(task: Task): Task {\r\n\r\n\u00a0\u00a0\u00a0val values = ContentValues()\r\n\r\n\u00a0\u00a0\u00a0if (task.name.isNotEmpty()) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ Don't save a task with no name\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0values.put(TasksContract.Columns.TASK_NAME, task.name)\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0values.put(TasksContract.Columns.TASK_DESCRIPTION, task.description)\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0values.put(TasksContract.Columns.TASK_SORT_ORDER, task.sortOrder)\u00a0 \/\/ defaults to zero if empty\r\n\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (task.id == 0L) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0GlobalScope.launch {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Log.d(TAG, \"saveTask: adding new task\")\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0val uri = getApplication&lt;Application&gt;().contentResolver?.insert(TasksContract.CONTENT_URI, values)\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (uri != null) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0task.id = TasksContract.getId(uri)\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Log.d(TAG, \"saveTask: new id is ${task.id}\")\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} else {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ task has an id, so we're updating\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0GlobalScope.launch {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Log.d(TAG, \"saveTask: updating task\")\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0getApplication&lt;Application&gt;().contentResolver?.update(TasksContract.buildUriFromId(task.id), values, null, null)\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0return task\r\n\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>7- When we want to fetch the data using a content provider<\/strong><\/p>\n<pre class=\"lang:default decode:true\">private fun loadTasks() {\r\n\r\n\u00a0\u00a0\u00a0val projection = arrayOf(TasksContract.Columns.ID,\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0TasksContract.Columns.TASK_NAME,\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0TasksContract.Columns.TASK_DESCRIPTION,\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0TasksContract.Columns.TASK_SORT_ORDER)\r\n\r\n\u00a0\u00a0\u00a0\/\/ &lt;order by&gt; Tasks.SortOrder, Tasks.Name\r\n\r\n\u00a0\u00a0\u00a0val sortOrder = \"${TasksContract.Columns.TASK_SORT_ORDER}, ${TasksContract.Columns.TASK_NAME}\"\r\n\r\n\r\nGlobalScope.launch {\r\n\r\n\u00a0\u00a0\u00a0val cursor = getApplication&lt;Application&gt;().contentResolver.query(\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0TasksContract.CONTENT_URI,\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0projection, null, null,\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0sortOrder)\r\n\r\n\u00a0\u00a0\u00a0databaseCursor.postValue(cursor)\r\n\r\n\u00a0\u00a0\u00a0}\r\n\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>8- When we want to insert new data in a content provider<\/strong><\/p>\n<pre class=\"lang:default decode:true\">fun saveTask(task: Task): Task {\r\n\r\n\u00a0\u00a0\u00a0val values = ContentValues()\r\n\r\n\r\n\u00a0\u00a0\u00a0if (task.name.isNotEmpty()) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ Don't save a task with no name\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0values.put(TasksContract.Columns.TASK_NAME, task.name)\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0values.put(TasksContract.Columns.TASK_DESCRIPTION, task.description)\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0values.put(TasksContract.Columns.TASK_SORT_ORDER, task.sortOrder)\u00a0 \/\/ defaults to zero if empty\r\n\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (task.id == 0L) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0GlobalScope.launch {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Log.d(TAG, \"saveTask: adding new task\")\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0val uri = getApplication&lt;Application&gt;().contentResolver?.insert(TasksContract.CONTENT_URI, values)\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (uri != null) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0task.id = TasksContract.getId(uri)\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Log.d(TAG, \"saveTask: new id is ${task.id}\")\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} else {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ task has an id, so we're updating\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0GlobalScope.launch {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Log.d(TAG, \"saveTask: updating task\")\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0getApplication&lt;Application&gt;().contentResolver?.update(TasksContract.buildUriFromId(task.id), values, null, null)\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0return task\r\n\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>9- When we want to delete the task<\/strong><\/p>\n<pre class=\"lang:default decode:true\">fun deleteTask(taskId: Long) {\r\n\r\n\u00a0\u00a0\u00a0Log.d(TAG, \"Deleting task\")\r\n\r\n\u00a0\u00a0\u00a0GlobalScope.launch {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0getApplication&lt;Application&gt;().contentResolver?.delete(TasksContract.buildUriFromId(taskId), null, null)\r\n\r\n\u00a0\u00a0\u00a0}\r\n\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A content provider manages access to a central repository of data. A provider is part of an Android application, which often provides its own UI for working with the data. However, content providers are primarily intended to be used by other applications, which access the provider using a provider-client object. How to use a Content [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":6707,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[593,592,590,591,594],"class_list":["post-6689","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-android","tag-android-app-developers","tag-android-content-provider","tag-android-developer","tag-content-provider-in-android","tag-content-providers-android-developers"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Content Provider in Android - Android Developers | InnovationM<\/title>\n<meta name=\"description\" content=\"The role of the content provider in the android system is like a central repository in which data of the applications are stored.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.innovationm.com\/blog\/content-provider-in-android\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Content Provider in Android - Android Developers | InnovationM\" \/>\n<meta property=\"og:description\" content=\"The role of the content provider in the android system is like a central repository in which data of the applications are stored.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.innovationm.com\/blog\/content-provider-in-android\/\" \/>\n<meta property=\"og:site_name\" content=\"InnovationM - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2021-03-25T10:59:19+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-03-25T11:03:24+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2021\/03\/Content-Provider-in-Android.png\" \/>\n\t<meta property=\"og:image:width\" content=\"960\" \/>\n\t<meta property=\"og:image:height\" content=\"540\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"InnovationM Admin\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"InnovationM Admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/content-provider-in-android\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/content-provider-in-android\\\/\"},\"author\":{\"name\":\"InnovationM Admin\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#\\\/schema\\\/person\\\/a831bf4602d69d1fa452e3de0c8862ed\"},\"headline\":\"Content Provider in Android\",\"datePublished\":\"2021-03-25T10:59:19+00:00\",\"dateModified\":\"2021-03-25T11:03:24+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/content-provider-in-android\\\/\"},\"wordCount\":185,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/content-provider-in-android\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/Content-Provider-in-Android.png\",\"keywords\":[\"Android app Developers\",\"Android Content Provider\",\"Android Developer\",\"Content Provider in Android\",\"Content Providers | Android Developers\"],\"articleSection\":[\"Android\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/content-provider-in-android\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/content-provider-in-android\\\/\",\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/content-provider-in-android\\\/\",\"name\":\"Content Provider in Android - Android Developers | InnovationM\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/content-provider-in-android\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/content-provider-in-android\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/Content-Provider-in-Android.png\",\"datePublished\":\"2021-03-25T10:59:19+00:00\",\"dateModified\":\"2021-03-25T11:03:24+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#\\\/schema\\\/person\\\/a831bf4602d69d1fa452e3de0c8862ed\"},\"description\":\"The role of the content provider in the android system is like a central repository in which data of the applications are stored.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/content-provider-in-android\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/content-provider-in-android\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/content-provider-in-android\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/Content-Provider-in-Android.png\",\"contentUrl\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/Content-Provider-in-Android.png\",\"width\":960,\"height\":540,\"caption\":\"Content Provider in Android\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/content-provider-in-android\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Content Provider in Android\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/\",\"name\":\"InnovationM - Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#\\\/schema\\\/person\\\/a831bf4602d69d1fa452e3de0c8862ed\",\"name\":\"InnovationM Admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g\",\"caption\":\"InnovationM Admin\"},\"sameAs\":[\"http:\\\/\\\/www.innovationm.com\\\/\"],\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/author\\\/innovationmadmin\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Content Provider in Android - Android Developers | InnovationM","description":"The role of the content provider in the android system is like a central repository in which data of the applications are stored.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.innovationm.com\/blog\/content-provider-in-android\/","og_locale":"en_US","og_type":"article","og_title":"Content Provider in Android - Android Developers | InnovationM","og_description":"The role of the content provider in the android system is like a central repository in which data of the applications are stored.","og_url":"https:\/\/www.innovationm.com\/blog\/content-provider-in-android\/","og_site_name":"InnovationM - Blog","article_published_time":"2021-03-25T10:59:19+00:00","article_modified_time":"2021-03-25T11:03:24+00:00","og_image":[{"width":960,"height":540,"url":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2021\/03\/Content-Provider-in-Android.png","type":"image\/png"}],"author":"InnovationM Admin","twitter_misc":{"Written by":"InnovationM Admin","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.innovationm.com\/blog\/content-provider-in-android\/#article","isPartOf":{"@id":"https:\/\/www.innovationm.com\/blog\/content-provider-in-android\/"},"author":{"name":"InnovationM Admin","@id":"https:\/\/www.innovationm.com\/blog\/#\/schema\/person\/a831bf4602d69d1fa452e3de0c8862ed"},"headline":"Content Provider in Android","datePublished":"2021-03-25T10:59:19+00:00","dateModified":"2021-03-25T11:03:24+00:00","mainEntityOfPage":{"@id":"https:\/\/www.innovationm.com\/blog\/content-provider-in-android\/"},"wordCount":185,"commentCount":0,"image":{"@id":"https:\/\/www.innovationm.com\/blog\/content-provider-in-android\/#primaryimage"},"thumbnailUrl":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2021\/03\/Content-Provider-in-Android.png","keywords":["Android app Developers","Android Content Provider","Android Developer","Content Provider in Android","Content Providers | Android Developers"],"articleSection":["Android"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.innovationm.com\/blog\/content-provider-in-android\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.innovationm.com\/blog\/content-provider-in-android\/","url":"https:\/\/www.innovationm.com\/blog\/content-provider-in-android\/","name":"Content Provider in Android - Android Developers | InnovationM","isPartOf":{"@id":"https:\/\/www.innovationm.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.innovationm.com\/blog\/content-provider-in-android\/#primaryimage"},"image":{"@id":"https:\/\/www.innovationm.com\/blog\/content-provider-in-android\/#primaryimage"},"thumbnailUrl":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2021\/03\/Content-Provider-in-Android.png","datePublished":"2021-03-25T10:59:19+00:00","dateModified":"2021-03-25T11:03:24+00:00","author":{"@id":"https:\/\/www.innovationm.com\/blog\/#\/schema\/person\/a831bf4602d69d1fa452e3de0c8862ed"},"description":"The role of the content provider in the android system is like a central repository in which data of the applications are stored.","breadcrumb":{"@id":"https:\/\/www.innovationm.com\/blog\/content-provider-in-android\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.innovationm.com\/blog\/content-provider-in-android\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.innovationm.com\/blog\/content-provider-in-android\/#primaryimage","url":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2021\/03\/Content-Provider-in-Android.png","contentUrl":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2021\/03\/Content-Provider-in-Android.png","width":960,"height":540,"caption":"Content Provider in Android"},{"@type":"BreadcrumbList","@id":"https:\/\/www.innovationm.com\/blog\/content-provider-in-android\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.innovationm.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Content Provider in Android"}]},{"@type":"WebSite","@id":"https:\/\/www.innovationm.com\/blog\/#website","url":"https:\/\/www.innovationm.com\/blog\/","name":"InnovationM - Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.innovationm.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.innovationm.com\/blog\/#\/schema\/person\/a831bf4602d69d1fa452e3de0c8862ed","name":"InnovationM Admin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g","caption":"InnovationM Admin"},"sameAs":["http:\/\/www.innovationm.com\/"],"url":"https:\/\/www.innovationm.com\/blog\/author\/innovationmadmin\/"}]}},"_links":{"self":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/posts\/6689","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/comments?post=6689"}],"version-history":[{"count":0,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/posts\/6689\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/media\/6707"}],"wp:attachment":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/media?parent=6689"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/categories?post=6689"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/tags?post=6689"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}