Android’de İçerik Sağlayıcı, uygulamanın verilerini tek bir yerde depolamak ve bu verileri gerektiğinde farklı uygulamaların erişmesi için kullanılabilir hale getirmek için merkezi bir havuz görevi görecektir.
Android’de, İçerik Sağlayıcıları, diğer uygulamaların güvenli bir şekilde erişmesine ve uygulama verilerimize gereksinimlerimize göre değiştirmesine izin verecek şekilde yapılandırabiliriz.
Genel olarak, İçerik Sağlayıcı bir android uygulamasının bir parçasıdır ve uygulama verilerini depolamak için daha çok ilişkisel bir veritabanı gibi davranır. Insert(), update(), delete() ve query() yöntemlerini kullanarak içerik sağlayıcıda depolanan veriler üzerinde ekleme, güncelleme, silme ve düzenleme gibi birden çok işlemi gerçekleştirebiliriz.
Android’de, uygulama verilerimizi diğer uygulamalarla paylaşmak istediğimizde içerik sağlayıcıyı kullanabiliriz ve uygulamamıza bağlı diğer uygulamaları etkilemeden uygulama verilerimizde değişiklik yapmamızı sağlar.
Android’de içerik sağlayıcı, uygulama verilerini depolamak için farklı yöntemler kullanıyor. Uygulama verileri, gereksinimlerimize göre bir SQLite veritabanında veya dosyalarda veya hatta bir ağ üzerinden saklanabilir. İçerik sağlayıcıları kullanarak ses, video, resim ve kişisel iletişim bilgileri gibi verileri yönetebiliriz.
Verileri paylaşmak için içerik sağlayıcıda farklı türde erişim izinlerine sahibiz. Yalnızca uygulamamızla sınırlı veri erişimini kısıtlamak için içerik sağlayıcıda erişim kısıtlama izinleri belirleyebilir ve bir veriyi okumak veya yazmak için farklı izinler yapılandırabiliriz.
İçerik Sağlayıcıdan Verilere Erişim
İçerik sağlayıcıdan bir veriye erişmek için sağlayıcı ile istemci olarak iletişim kurmak için uygulamamızdaki ContentResolver nesnesini kullanmamız gerekiyor. ContentResolver nesnesi, bir sınıf örneği tarafından uygulanan sağlayıcı nesnesiyle (ContentProvider) iletişim kurar.
Genellikle, Android’de UI’den ContentResolver’a bir istek göndermek için, sorguyu arka planda eşzamansız olarak çalıştırmak için kullanılan CursorLoader adında başka bir nesnemiz vardır. Android uygulamasında, Activity veya Fragment gibi UI bileşenleri, ContentResolver kullanarak ContentProvider’dan gerekli verileri sorgulamak ve almak için bir CursorLoader çağırır.
ContentProvider nesnesi, istemciden veri isteklerini alır, istenen eylemleri gerçekleştirir (oluşturma, güncelleme, silme, geri alma) ve sonucu döndürür.
Aşağıda, ContentProvider nesnesinden veri almak için Activity veya Fragment kullanarak kullanıcı arayüzünden bir işlem istemenin resimli temsili yer almaktadır.

Bu, veri almak için gerekli eylemleri gerçekleştirmek için android uygulama kullanıcı arayüzü ile içerik sağlayıcılar arasındaki etkileşimin nasıl gerçekleşeceğidir.
İçerik URI’leri
Android’de İçerik URI’si, gerekli verileri almak için bir içerik sağlayıcıyı sorgulamak için kullanılan bir URI’dir. İçerik URI’leri, tüm sağlayıcının (yetkili) adını ve bir tabloya (yol) işaret eden adı içerecektir.
Genellikle android uygulamalarda URI formatı aşağıdaki gibi olacaktır.
1 2 3 | content://authority/path |
Android uygulamasında bir URI’nin çeşitli bölümleriyle ilgili ayrıntılar aşağıdadır.
content:// : content:// dizesi URI’de her zaman bulunur ve verilen URI’nin bir içerik URI’si olduğunu göstermek için kullanılır.
authority : İçerik sağlayıcının adını temsil eder, örneğin telefon, kişiler vb. ve com.tutlane.contactprovider gibi üçüncü taraf içerik sağlayıcılar için tam nitelikli bir ad kullanmamız gerekir
path : Tablonun yolunu temsil eder.
ContentResolver nesnesi, uygun sağlayıcıyı bulmak ve sorgu nesnelerini doğru sağlayıcıya göndermek için URI’nin yetkisini kullanır. Bundan sonra ContentProvider, erişilecek doğru tabloyu seçmek için içerik URI’sinin yolunu kullanır.
Aşağıda, android uygulamalarında basit bir URI örneği örneği verilmiştir.
1 2 3 | content://contacts_info/users |
Burada content:// dizesi, URI’nin bir içerik URI’si olduğunu göstermek için kullanılır, contact_info dizesi, sağlayıcının yetkisinin adıdır ve kullanıcılar dizesi, tablonun yoludur.
İçerik Sağlayıcı Oluşturma
Android uygulamalarda içerik sağlayıcı oluşturmak için aşağıdaki adımları izlemeliyiz.
- ContentProvider temel sınıfını genişleten bir içerik sağlayıcı sınıfı oluşturmamız gerekiyor.
- İçeriğe erişmek için içerik sağlayıcı URI’mizi tanımlamamız gerekiyor.
- ContentProvider sınıfı, tüm bu yöntemleri alt sınıfımızın bir parçası olarak uygulamamız gereken altı soyut yöntem (insert(), update(), delete(), query(), getType()) tanımlar.
- <provider> etiketini kullanarak içerik sağlayıcımızı AndroidManifest.xml’e kaydetmemiz gerekiyor.
ContentProvider sınıfının bir parçası olarak uygulanması gereken yöntemlerin listesi aşağıdadır.

- query() – İstemciden bir istek alır. Argümanları kullanarak, istenen tablodan bir veri alır ve verileri bir cursor nesnesi olarak döndürür.
- insert() – Bu metot, içerik sağlayıcımıza yeni bir satır ekleyecek ve yeni eklenen satır için içerik URI’sini döndürecektir.
- update() – Bu metot, içerik sağlayıcımızdaki mevcut satırları günceller ve güncellenen satır sayısını döndürür.
- delete() – Bu metot içerik sağlayıcımızdaki satırları siler ve silinen satırların sayısını döndürür.
- getType() – Bu metot, MIME veri türünü verilen içerik URI’sine döndürür.
- onCreate() – Bu metot sağlayıcımızı başlatacak. Android sistemi, sağlayıcımızı oluşturduktan hemen sonra bu yöntemi arayacaktır.
Android İçerik Sağlayıcı Örneği
Aşağıda, android uygulamalarında İçerik Sağlayıcı kullanma örneği verilmiştir. Burada android uygulamasına veri eklemek ve bunlara erişmek için kendi içerik sağlayıcımızı oluşturacağız.
Android studio kullanarak yeni bir android uygulaması oluşturun ve ContentProvider olarak isim verin. Android stüdyosunda bir uygulama oluşturmanın farkında değilseniz, Android Hello World App makalesine bakın.
Şimdi, gerçek sağlayıcımızı ve bununla ilgili yöntemleri tanımlamak için srcmainjavacom.tutlane.contentprovider yolunda kendi UserProvider.java içerik sağlayıcı dosyamızı oluşturmamız gerekiyor. Java Sınıfı ve UserProvider.java olarak isim verin.
UserProvider.java adlı yeni bir dosya oluşturduğumuzda, onu açın ve aşağıdaki gibi kodu yazın.
UserProvider.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 | package com.example.contentprovider; 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 UserProvider extends ContentProvider { static final String PROVIDER_NAME = "com.example.contentprovider.UserProvider"; static final String URL = "content://" + PROVIDER_NAME + "/users"; 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 { uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); uriMatcher.addURI(PROVIDER_NAME, "users", uriCode); 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); } } @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; } @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; } private SQLiteDatabase db; static final String DATABASE_NAME = "EmpDB"; static final String TABLE_NAME = "Employees"; static final int DATABASE_VERSION = 1; static final String CREATE_DB_TABLE = " CREATE TABLE " + TABLE_NAME + " (id INTEGER PRIMARY KEY AUTOINCREMENT, " + " name TEXT NOT NULL);"; 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 " + TABLE_NAME); onCreate(db); } } } |
Şimdi \src\main\res\layout yolundan bir activity_main.xml dosyası açın ve aşağıdaki gibi kodu yazın.
activity_main.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Name" android:layout_marginLeft="100dp" android:layout_marginTop="100dp"/> <EditText android:id="@+id/txtName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="100dp" android:ems="10"/> <Button android:id="@+id/btnAdd" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onClickAddDetails" android:layout_marginLeft="100dp" android:text="Add User"/> <Button android:id="@+id/btnRetrieve" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onClickShowDetails" android:layout_marginLeft="100dp" android:text="Show Users"/> <TextView android:id="@+id/res" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="100dp" android:clickable="false" android:ems="10"/> </LinearLayout> |
Şimdi MainActivity.java dosyasını açın ve aşağıdaki gibi kodu yazın.
MainActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | package com.example.contentprovider; 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) { ContentValues values = new ContentValues(); values.put(UserProvider.name, ((EditText) findViewById(R.id.txtName)).getText().toString()); getContentResolver().insert(UserProvider.CONTENT_URI, values); Toast.makeText(getBaseContext(), "New Record Inserted", Toast.LENGTH_LONG).show(); } public void onClickShowDetails(View view) { // Retrieve employee records TextView resultView= (TextView) findViewById(R.id.res); Cursor cursor = getContentResolver().query(Uri.parse("content://com.example.contentprovider.UserProvider/users"), null, null, null, null); 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"); } } } |
Bu yeni oluşturulan içerik sağlayıcıyı, aşağıda gösterildiği gibi <provider> özniteliğini kullanarak android manifest dosyasına (ActivityManifest.xml) dahil etmemiz gerekiyor.
AndroidManifest.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.contentprovider"> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission> <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/Theme.ContentProvider"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <provider android:authorities="com.example.contentprovider.UserProvider" android:name=".UserProvider"> </provider> </application> </manifest> |
Android İçerik Sağlayıcı Örneğinin Çıktısı
Yukarıdaki örneği Android emulatöründe çalıştırdığımızda, aşağıda gösterildiği gibi bir sonuç elde edeceğiz.

Diğer uygulamaların gereksinimlerimize göre erişmesine izin vermek için verileri merkezi bir konumda depolamak için android uygulamamızdaki içerik sağlayıcıları bu şekilde kullanabiliriz.