{"id":33116,"date":"2025-10-29T21:42:30","date_gmt":"2025-10-29T18:42:30","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=33116"},"modified":"2025-10-29T21:42:30","modified_gmt":"2025-10-29T18:42:30","slug":"sqlite-veritabani-temelleri-ve-android-entegrasyonu","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/sqlite-veritabani-temelleri-ve-android-entegrasyonu\/","title":{"rendered":"SQLite Veritaban\u0131 Temelleri ve Android Entegrasyonu"},"content":{"rendered":"<p><body><\/p>\n<p>Android uygulamalar\u0131 geli\u015ftirirken veri depolama, uygulaman\u0131n temel ihtiya\u00e7lar\u0131ndan biridir. Kullan\u0131c\u0131 ayarlar\u0131, uygulama i\u00e7eri\u011fi veya \u00e7evrimd\u0131\u015f\u0131 eri\u015fim gerektiren her t\u00fcrl\u00fc veri i\u00e7in g\u00fcvenilir ve kal\u0131c\u0131 bir depolama \u00e7\u00f6z\u00fcm\u00fc \u015fartt\u0131r. Android, bu ihtiyac\u0131 kar\u015f\u0131lamak i\u00e7in hafif ve g\u00f6m\u00fcl\u00fc bir ili\u015fkisel veritaban\u0131 y\u00f6netim sistemi olan SQLite&#8217;\u0131 varsay\u0131lan olarak sunar. Bu rehberde, Android uygulamalar\u0131n\u0131zda SQLite veritaban\u0131n\u0131 nas\u0131l olu\u015fturaca\u011f\u0131n\u0131z\u0131, y\u00f6netece\u011finizi ve CRUD (Create, Read, Update, Delete) i\u015flemlerini nas\u0131l ger\u00e7ekle\u015ftirece\u011finizi ad\u0131m ad\u0131m \u00f6\u011freneceksiniz.<\/p>\n<p>SQLite, sunucusuz (serverless), kendi kendine yeten (self-contained) ve s\u0131f\u0131r yap\u0131land\u0131rma (zero-configuration) gerektiren bir veritaban\u0131d\u0131r. Bu \u00f6zellikleri sayesinde mobil cihazlar i\u00e7in ideal bir se\u00e7imdir. Veritaban\u0131 t\u00fcm\u00fcyle bir dosya i\u00e7inde depolan\u0131r ve uygulama i\u00e7inden do\u011frudan eri\u015filebilir. Android SDK, SQLite veritabanlar\u0131yla etkile\u015fim kurmak i\u00e7in g\u00fc\u00e7l\u00fc API&#8217;ler sa\u011flar ve bu sayede geli\u015ftiriciler kolayca veritaban\u0131 i\u015flemleri yapabilirler.<\/p>\n<h2>SQLite Veritaban\u0131 Temelleri ve Android Entegrasyonu<\/h2>\n<p>Android&#8217;de SQLite veritaban\u0131 ile \u00e7al\u0131\u015fman\u0131n merkezinde <code>SQLiteOpenHelper<\/code> s\u0131n\u0131f\u0131 bulunur. Bu s\u0131n\u0131f, veritaban\u0131n\u0131n olu\u015fturulmas\u0131, s\u00fcr\u00fcm kontrol\u00fc ve y\u00fckseltilmesi gibi karma\u015f\u0131k g\u00f6revleri basitle\u015ftirir. Uygulaman\u0131z ilk kez \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda veya veritaban\u0131 s\u00fcr\u00fcm\u00fcn\u00fc de\u011fi\u015ftirdi\u011finizde, <code>SQLiteOpenHelper<\/code> sizin i\u00e7in gerekli i\u015flemleri otomatik olarak y\u00f6netir.<\/p>\n<h3>Temel Kavramlar:<\/h3>\n<ul>\n<li><strong>Veritaban\u0131 (Database):<\/strong> Verilerin depoland\u0131\u011f\u0131 ana yap\u0131d\u0131r. Genellikle bir <code>.db<\/code> dosyas\u0131 olarak saklan\u0131r.<\/li>\n<li><strong>Tablo (Table):<\/strong> Verilerin d\u00fczenli bir \u015fekilde sakland\u0131\u011f\u0131 yap\u0131lard\u0131r. Her tablo, belirli bir t\u00fcrdeki verileri i\u00e7erir (\u00f6rne\u011fin, &#8220;Kullan\u0131c\u0131lar&#8221; tablosu, &#8220;\u00dcr\u00fcnler&#8221; tablosu).<\/li>\n<li><strong>S\u00fctun (Column):<\/strong> Tablodaki her bir veri par\u00e7as\u0131n\u0131n \u00f6zelli\u011fini tan\u0131mlar (\u00f6rne\u011fin, &#8220;Kullan\u0131c\u0131 Ad\u0131&#8221;, &#8220;E-posta&#8221;).<\/li>\n<li><strong>Sat\u0131r (Row):<\/strong> Tablodaki tek bir veri kayd\u0131n\u0131 temsil eder (\u00f6rne\u011fin, bir kullan\u0131c\u0131n\u0131n t\u00fcm bilgileri).<\/li>\n<li><strong>CRUD \u0130\u015flemleri:<\/strong> Veritaban\u0131 ile etkile\u015fim kurman\u0131n d\u00f6rt temel i\u015flemidir:\n<ul>\n<li><strong>Create (Olu\u015fturma):<\/strong> Yeni veri ekleme.<\/li>\n<li><strong>Read (Okuma):<\/strong> Mevcut verileri alma.<\/li>\n<li><strong>Update (G\u00fcncelleme):<\/strong> Mevcut verileri de\u011fi\u015ftirme.<\/li>\n<li><strong>Delete (Silme):<\/strong> Mevcut verileri kald\u0131rma.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><code>SQLiteOpenHelper<\/code> s\u0131n\u0131f\u0131, veritaban\u0131 olu\u015fturuldu\u011funda veya y\u00fckseltildi\u011finde \u00e7a\u011fr\u0131lan iki \u00f6nemli metot i\u00e7erir:<\/p>\n<ul>\n<li><code>onCreate(SQLiteDatabase db)<\/code>: Veritaban\u0131 ilk kez olu\u015fturuldu\u011funda \u00e7a\u011fr\u0131l\u0131r. Tablolar\u0131n\u0131z\u0131 olu\u015fturmak i\u00e7in SQL <code>CREATE TABLE<\/code> komutlar\u0131n\u0131 burada y\u00fcr\u00fct\u00fcrs\u00fcn\u00fcz.<\/li>\n<li><code>onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)<\/code>: Veritaban\u0131 s\u00fcr\u00fcm\u00fc y\u00fckseltildi\u011finde \u00e7a\u011fr\u0131l\u0131r. Bu metot, mevcut verileri kaybetmeden tablo yap\u0131s\u0131n\u0131 g\u00fcncellemek i\u00e7in kullan\u0131l\u0131r. Genellikle eski tablolar\u0131 silip yenilerini olu\u015fturma veya <code>ALTER TABLE<\/code> komutlar\u0131n\u0131 kullanma gibi i\u015flemler yap\u0131l\u0131r.<\/li>\n<\/ul>\n<h2>Uygulama Yap\u0131s\u0131 ve Veritaban\u0131 S\u0131n\u0131f\u0131 Olu\u015fturma<\/h2>\n<p>Bir Android projesinde SQLite veritaban\u0131 ile \u00e7al\u0131\u015fmak i\u00e7in \u00f6ncelikle bir yard\u0131mc\u0131 s\u0131n\u0131f olu\u015fturmam\u0131z gerekir. Bu s\u0131n\u0131f, <code>SQLiteOpenHelper<\/code>&#8216;dan t\u00fcretilecektir. \u00d6rnek olarak, basit bir &#8220;Yap\u0131lacaklar Listesi&#8221; uygulamas\u0131 i\u00e7in g\u00f6revleri (tasks) depolayaca\u011f\u0131m\u0131z bir veritaban\u0131 olu\u015fturaca\u011f\u0131z.<\/p>\n<h3>Proje Kurulumu<\/h3>\n<p>Yeni bir Android Studio projesi olu\u015fturun ve bo\u015f bir etkinlik (Empty Activity) se\u00e7in. Projeye &#8220;SQLiteTutorial&#8221; gibi bir isim verebilirsiniz.<\/p>\n<h3>Veritaban\u0131 Yard\u0131mc\u0131 S\u0131n\u0131f\u0131 Olu\u015fturma<\/h3>\n<p><code>app\/java\/com.example.sqlitetutorial<\/code> klas\u00f6r\u00fcnde <code>DatabaseHelper.java<\/code> ad\u0131nda yeni bir Java s\u0131n\u0131f\u0131 olu\u015fturun.<\/p>\n<pre><code class=\"language-java\">\npackage com.example.sqlitetutorial;\n\nimport android.content.Context;\nimport android.database.sqlite.SQLiteDatabase;\nimport android.database.sqlite.SQLiteOpenHelper;\n\npublic class DatabaseHelper extends SQLiteOpenHelper {\n\n    \/\/ Veritaban\u0131 ad\u0131 ve s\u00fcr\u00fcm\u00fc\n    private static final String DATABASE_NAME = \"task_manager.db\";\n    private static final int DATABASE_VERSION = 1;\n\n    \/\/ G\u00f6revler tablosu ad\u0131 ve s\u00fctunlar\u0131\n    public static final String TABLE_TASKS = \"tasks\";\n    public static final String COLUMN_ID = \"_id\"; \/\/ Genellikle _id kullan\u0131l\u0131r\n    public static final String COLUMN_TASK_NAME = \"task_name\";\n    public static final String COLUMN_IS_COMPLETED = \"is_completed\"; \/\/ 0: false, 1: true\n\n    \/\/ Tablo olu\u015fturma SQL sorgusu\n    private static final String CREATE_TABLE_TASKS = \"CREATE TABLE \" + TABLE_TASKS + \"(\"\n            + COLUMN_ID + \" INTEGER PRIMARY KEY AUTOINCREMENT,\"\n            + COLUMN_TASK_NAME + \" TEXT NOT NULL,\"\n            + COLUMN_IS_COMPLETED + \" INTEGER DEFAULT 0\"\n            + \");\";\n\n    public DatabaseHelper(Context context) {\n        super(context, DATABASE_NAME, null, DATABASE_VERSION);\n    }\n\n    @Override\n    public void onCreate(SQLiteDatabase db) {\n        db.execSQL(CREATE_TABLE_TASKS);\n    }\n\n    @Override\n    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {\n        \/\/ Veritaban\u0131 s\u00fcr\u00fcm\u00fc y\u00fckseltildi\u011finde eski tabloyu silip yenisini olu\u015ftur\n        \/\/ Ger\u00e7ek uygulamalarda ALTER TABLE kullanmak daha iyidir, veri kayb\u0131n\u0131 \u00f6nler\n        db.execSQL(\"DROP TABLE IF EXISTS \" + TABLE_TASKS);\n        onCreate(db);\n    }\n}\n<\/code><\/pre>\n<p>Yukar\u0131daki kodda:<\/p>\n<ul>\n<li><code>DATABASE_NAME<\/code>: Uygulaman\u0131z\u0131n veritaban\u0131 dosyas\u0131n\u0131n ad\u0131d\u0131r.<\/li>\n<li><code>DATABASE_VERSION<\/code>: Veritaban\u0131n\u0131n s\u00fcr\u00fcm numaras\u0131d\u0131r. \u015eema de\u011fi\u015fiklikleri yapt\u0131\u011f\u0131n\u0131zda bu numaray\u0131 art\u0131rman\u0131z gerekir.<\/li>\n<li><code>TABLE_TASKS<\/code> ve <code>COLUMN_...<\/code> sabitleri, tablo ad\u0131n\u0131 ve s\u00fctun adlar\u0131n\u0131 tan\u0131mlar. Bu, yaz\u0131m hatalar\u0131n\u0131 \u00f6nlemek ve kodu daha okunabilir hale getirmek i\u00e7in iyi bir pratiktir.<\/li>\n<li><code>CREATE_TABLE_TASKS<\/code> SQL sorgusu, <code>tasks<\/code> ad\u0131nda bir tablo olu\u015fturur. Bu tablo, otomatik artan birincil anahtar (<code>_id<\/code>), g\u00f6rev ad\u0131 (<code>task_name<\/code>) ve tamamlanma durumu (<code>is_completed<\/code>) s\u00fctunlar\u0131n\u0131 i\u00e7erir.<\/li>\n<li><code>onCreate()<\/code> metodu, veritaban\u0131 ilk kez olu\u015fturuldu\u011funda tablo olu\u015fturma sorgusunu \u00e7al\u0131\u015ft\u0131r\u0131r.<\/li>\n<li><code>onUpgrade()<\/code> metodu, veritaban\u0131 s\u00fcr\u00fcm\u00fc de\u011fi\u015fti\u011finde \u00e7a\u011fr\u0131l\u0131r. Bu \u00f6rnekte basit\u00e7e eski tabloyu silip yenisini olu\u015fturuyoruz. Ger\u00e7ek bir uygulamada, mevcut verileri korumak i\u00e7in <code>ALTER TABLE<\/code> gibi daha sofistike SQL komutlar\u0131 kullanman\u0131z \u00f6nerilir.<\/li>\n<\/ul>\n<h2>CRUD \u0130\u015flemlerini Ger\u00e7ekle\u015ftirme<\/h2>\n<p>\u015eimdi <code>DatabaseHelper<\/code> s\u0131n\u0131f\u0131m\u0131za g\u00f6revleri eklemek, okumak, g\u00fcncellemek ve silmek i\u00e7in metotlar ekleyelim.<\/p>\n<h3>1. Create (Ekleme) \u0130\u015flemi<\/h3>\n<p>Yeni bir g\u00f6rev eklemek i\u00e7in <code>insert()<\/code> metodunu kullan\u0131r\u0131z. Bu metot, eklenecek verileri anahtar-de\u011fer \u00e7iftleri olarak tutan bir <code>ContentValues<\/code> nesnesi al\u0131r.<\/p>\n<pre><code class=\"language-java\">\n\/\/ ... DatabaseHelper s\u0131n\u0131f\u0131n\u0131n i\u00e7ine eklenecek metotlar ...\n\nimport android.content.ContentValues;\nimport android.database.Cursor; \/\/ Cursor'\u0131 da import edin\n\npublic class DatabaseHelper extends SQLiteOpenHelper {\n    \/\/ ... (\u00f6nceki kodlar) ...\n\n    \/<em><\/em>\n     * Yeni bir g\u00f6rev ekler.\n     * @param taskName Eklenecek g\u00f6revin ad\u0131.\n     * @return Ekleme ba\u015far\u0131l\u0131ysa yeni sat\u0131r\u0131n ID'si, ba\u015far\u0131s\u0131zsa -1.\n     *\/\n    public long addTask(String taskName) {\n        SQLiteDatabase db = this.getWritableDatabase(); \/\/ Yaz\u0131labilir veritaban\u0131 \u00f6rne\u011fi al\n\n        ContentValues values = new ContentValues();\n        values.put(COLUMN_TASK_NAME, taskName);\n        values.put(COLUMN_IS_COMPLETED, 0); \/\/ Varsay\u0131lan olarak tamamlanmam\u0131\u015f\n\n        \/\/ Veriyi tabloya ekle\n        long newRowId = db.insert(TABLE_TASKS, null, values);\n        db.close(); \/\/ Veritaban\u0131 ba\u011flant\u0131s\u0131n\u0131 kapat\n        return newRowId;\n    }\n}\n<\/code><\/pre>\n<h3>2. Read (Okuma) \u0130\u015flemi<\/h3>\n<p>Mevcut g\u00f6revleri okumak i\u00e7in <code>query()<\/code> metodunu kullan\u0131r\u0131z. Bu metot, sorgunun sonu\u00e7lar\u0131n\u0131 i\u00e7eren bir <code>Cursor<\/code> nesnesi d\u00f6nd\u00fcr\u00fcr. <code>Cursor<\/code>, veritaban\u0131 sonu\u00e7 k\u00fcmesinde sat\u0131r sat\u0131r gezinmemizi sa\u011flar.<\/p>\n<pre><code class=\"language-java\">\n\/\/ ... DatabaseHelper s\u0131n\u0131f\u0131n\u0131n i\u00e7ine eklenecek metotlar ...\n\n    \/<em><\/em>\n     * T\u00fcm g\u00f6revleri okur.\n     * @return G\u00f6revleri i\u00e7eren bir Cursor.\n     *\/\n    public Cursor getAllTasks() {\n        SQLiteDatabase db = this.getReadableDatabase(); \/\/ Okunabilir veritaban\u0131 \u00f6rne\u011fi al\n        return db.query(\n                TABLE_TASKS,    \/\/ Sorgulanacak tablo\n                new String[]{COLUMN_ID, COLUMN_TASK_NAME, COLUMN_IS_COMPLETED}, \/\/ D\u00f6nd\u00fcr\u00fclecek s\u00fctunlar\n                null,           \/\/ WHERE ko\u015fulu (null t\u00fcm sat\u0131rlar\u0131 getirir)\n                null,           \/\/ WHERE ko\u015fulunun arg\u00fcmanlar\u0131\n                null,           \/\/ GROUP BY\n                null,           \/\/ HAVING\n                COLUMN_ID + \" ASC\" \/\/ ORDER BY (ID'ye g\u00f6re artan s\u0131ralama)\n        );\n    }\n<\/code><\/pre>\n<p><strong>Pratik Bilgi:<\/strong> <code>Cursor<\/code> nesnesini kulland\u0131ktan sonra her zaman <code>cursor.close()<\/code> metodunu \u00e7a\u011f\u0131rarak kaynaklar\u0131 serbest b\u0131rakmal\u0131s\u0131n\u0131z. Aksi takdirde bellek s\u0131z\u0131nt\u0131lar\u0131na neden olabilirsiniz.<\/p>\n<h3>3. Update (G\u00fcncelleme) \u0130\u015flemi<\/h3>\n<p>Mevcut bir g\u00f6revi g\u00fcncellemek i\u00e7in <code>update()<\/code> metodunu kullan\u0131r\u0131z. Bu metot da <code>ContentValues<\/code> ve bir <code>WHERE<\/code> ko\u015fulu al\u0131r.<\/p>\n<pre><code class=\"language-java\">\n\/\/ ... DatabaseHelper s\u0131n\u0131f\u0131n\u0131n i\u00e7ine eklenecek metotlar ...\n\n    \/<em><\/em>\n     * Bir g\u00f6revin tamamlanma durumunu g\u00fcnceller.\n     * @param taskId G\u00fcncellenecek g\u00f6revin ID'si.\n     * @param isCompleted G\u00f6revin yeni tamamlanma durumu (0 veya 1).\n     * @return G\u00fcncellenen sat\u0131r say\u0131s\u0131.\n     *\/\n    public int updateTaskStatus(long taskId, int isCompleted) {\n        SQLiteDatabase db = this.getWritableDatabase();\n\n        ContentValues values = new ContentValues();\n        values.put(COLUMN_IS_COMPLETED, isCompleted);\n\n        \/\/ WHERE ko\u015fulu: sadece belirli bir ID'ye sahip g\u00f6revi g\u00fcncelle\n        String selection = COLUMN_ID + \" = ?\";\n        String[] selectionArgs = { String.valueOf(taskId) };\n\n        int count = db.update(\n                TABLE_TASKS,\n                values,\n                selection,\n                selectionArgs\n        );\n        db.close();\n        return count;\n    }\n<\/code><\/pre>\n<h3>4. Delete (Silme) \u0130\u015flemi<\/h3>\n<p>Mevcut bir g\u00f6revi silmek i\u00e7in <code>delete()<\/code> metodunu kullan\u0131r\u0131z. Bu metot sadece bir <code>WHERE<\/code> ko\u015fulu al\u0131r.<\/p>\n<pre><code class=\"language-java\">\n\/\/ ... DatabaseHelper s\u0131n\u0131f\u0131n\u0131n i\u00e7ine eklenecek metotlar ...\n\n    \/<em><\/em>\n     * Bir g\u00f6revi siler.\n     * @param taskId Silinecek g\u00f6revin ID'si.\n     * @return Silinen sat\u0131r say\u0131s\u0131.\n     *\/\n    public int deleteTask(long taskId) {\n        SQLiteDatabase db = this.getWritableDatabase();\n\n        \/\/ WHERE ko\u015fulu: sadece belirli bir ID'ye sahip g\u00f6revi sil\n        String selection = COLUMN_ID + \" = ?\";\n        String[] selectionArgs = { String.valueOf(taskId) };\n\n        int deletedRows = db.delete(\n                TABLE_TASKS,\n                selection,\n                selectionArgs\n        );\n        db.close();\n        return deletedRows;\n    }\n} \/\/ DatabaseHelper s\u0131n\u0131f\u0131n\u0131n kapan\u0131\u015f\u0131\n<\/code><\/pre>\n<h2>Kullan\u0131c\u0131 Aray\u00fcz\u00fc ile Entegrasyon ve Pratik \u0130pu\u00e7lar\u0131<\/h2>\n<p>Veritaban\u0131 i\u015flemlerini <code>DatabaseHelper<\/code> s\u0131n\u0131f\u0131nda tan\u0131mlad\u0131ktan sonra, bu metotlar\u0131 etkinliklerinizden (Activities) veya par\u00e7alar\u0131n\u0131zdan (Fragments) \u00e7a\u011f\u0131rabilirsiniz. Basit bir \u00f6rnek olarak, <code>MainActivity<\/code> i\u00e7inde bir g\u00f6rev ekleyip t\u00fcm g\u00f6revleri listeleyelim.<\/p>\n<h3>MainActivity.java<\/h3>\n<pre><code class=\"language-java\">\npackage com.example.sqlitetutorial;\n\nimport androidx.appcompat.app.AppCompatActivity;\n\nimport android.database.Cursor;\nimport android.os.Bundle;\nimport android.util.Log;\nimport android.view.View;\nimport android.widget.Button;\nimport android.widget.EditText;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class MainActivity extends AppCompatActivity {\n\n    private static final String TAG = \"MainActivity\";\n    private DatabaseHelper dbHelper;\n\n    private EditText etTaskName;\n    private Button btnAddTask;\n    private Button btnListTasks;\n    private TextView tvTaskList;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_main);\n\n        dbHelper = new DatabaseHelper(this); \/\/ DatabaseHelper \u00f6rne\u011fini olu\u015ftur\n\n        etTaskName = findViewById(R.id.etTaskName);\n        btnAddTask = findViewById(R.id.btnAddTask);\n        btnListTasks = findViewById(R.id.btnListTasks);\n        tvTaskList = findViewById(R.id.tvTaskList);\n\n        btnAddTask.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                String taskName = etTaskName.getText().toString().trim();\n                if (!taskName.isEmpty()) {\n                    long newRowId = dbHelper.addTask(taskName);\n                    if (newRowId != -1) {\n                        Toast.makeText(MainActivity.this, \"G\u00f6rev eklendi: \" + taskName, Toast.LENGTH_SHORT).show();\n                        etTaskName.setText(\"\"); \/\/ EditText'i temizle\n                        listAllTasks(); \/\/ G\u00f6revleri tekrar listele\n                    } else {\n                        Toast.makeText(MainActivity.this, \"G\u00f6rev eklenirken hata olu\u015ftu.\", Toast.LENGTH_SHORT).show();\n                    }\n                } else {\n                    Toast.makeText(MainActivity.this, \"G\u00f6rev ad\u0131 bo\u015f olamaz.\", Toast.LENGTH_SHORT).show();\n                }\n            }\n        });\n\n        btnListTasks.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                listAllTasks();\n            }\n        });\n\n        \/\/ Uygulama ba\u015flad\u0131\u011f\u0131nda g\u00f6revleri listele\n        listAllTasks();\n    }\n\n    private void listAllTasks() {\n        Cursor cursor = dbHelper.getAllTasks();\n        List<String> taskList = new ArrayList<>();\n\n        if (cursor != null && cursor.moveToFirst()) {\n            do {\n                \/\/ S\u00fctun indekslerini al\n                int idIndex = cursor.getColumnIndex(DatabaseHelper.COLUMN_ID);\n                int nameIndex = cursor.getColumnIndex(DatabaseHelper.COLUMN_TASK_NAME);\n                int completedIndex = cursor.getColumnIndex(DatabaseHelper.COLUMN_IS_COMPLETED);\n\n                \/\/ Verileri al\n                long id = cursor.getLong(idIndex);\n                String name = cursor.getString(nameIndex);\n                int isCompleted = cursor.getInt(completedIndex);\n\n                taskList.add(id + \". \" + name + \" (\" + (isCompleted == 1 ? \"Tamamland\u0131\" : \"Bekliyor\") + \")\");\n            } while (cursor.moveToNext());\n        }\n\n        if (cursor != null) {\n            cursor.close(); \/\/ Cursor'\u0131 kapatmay\u0131 unutmay\u0131n!\n        }\n\n        if (taskList.isEmpty()) {\n            tvTaskList.setText(\"Hen\u00fcz g\u00f6rev yok.\");\n        } else {\n            tvTaskList.setText(String.join(\"\\n\", taskList));\n        }\n    }\n\n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n        \/\/ Uygulama kapan\u0131rken veritaban\u0131 ba\u011flant\u0131s\u0131n\u0131 kapatmak iyi bir pratiktir.\n        \/\/ Ancak DatabaseHelper'daki her metot sonras\u0131 close() \u00e7a\u011fr\u0131ld\u0131\u011f\u0131 i\u00e7in burada zorunlu de\u011fil.\n        \/\/ E\u011fer DatabaseHelper singleton olarak y\u00f6netilseydi, burada kapatmak daha uygun olabilirdi.\n        \/\/ dbHelper.close(); \/\/ Bu \u00f6rnekte her i\u015flem sonras\u0131 kapatt\u0131\u011f\u0131m\u0131z i\u00e7in yorum sat\u0131r\u0131.\n    }\n}\n<\/code><\/pre>\n<h3>activity_main.xml (Layout Dosyas\u0131)<\/h3>\n<pre><code class=\"language-xml\">\n<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\n    xmlns:app=\"http:\/\/schemas.android.com\/apk\/res-auto\"\n    xmlns:tools=\"http:\/\/schemas.android.com\/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    android:padding=\"16dp\"\n    tools:context=\".MainActivity\">\n\n    <EditText\n        android:id=\"@+id\/etTaskName\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:hint=\"Yeni g\u00f6rev ad\u0131\"\n        android:inputType=\"text\" \/>\n\n    <Button\n        android:id=\"@+id\/btnAddTask\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"G\u00f6rev Ekle\" \/>\n\n    <Button\n        android:id=\"@+id\/btnListTasks\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"8dp\"\n        android:text=\"G\u00f6revleri Listele\" \/>\n\n    <TextView\n        android:id=\"@+id\/tvTaskList\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"16dp\"\n        android:textSize=\"16sp\"\n        android:text=\"G\u00f6revler burada listelenecek.\" \/>\n\n<\/LinearLayout>\n<\/code><\/pre>\n<h3>Pratik \u0130pu\u00e7lar\u0131:<\/h3>\n<ul>\n<li><strong>Arka Plan \u0130\u015f Par\u00e7ac\u0131klar\u0131:<\/strong> Veritaban\u0131 i\u015flemleri (\u00f6zellikle okuma ve yazma) zaman al\u0131c\u0131 olabilir ve ana i\u015f par\u00e7ac\u0131\u011f\u0131nda (UI thread) yap\u0131ld\u0131\u011f\u0131nda uygulaman\u0131z\u0131n donmas\u0131na (ANR &#8211; Application Not Responding) neden olabilir. Bu nedenle, veritaban\u0131 i\u015flemlerini her zaman arka plan i\u015f par\u00e7ac\u0131klar\u0131nda (\u00f6rne\u011fin, <code>AsyncTask<\/code>, Kotlin Coroutines, Java <code>Executor<\/code> servisleri) yapman\u0131z \u015fiddetle tavsiye edilir.<\/li>\n<li><strong>Singleton Modeli:<\/strong> <code>DatabaseHelper<\/code> s\u0131n\u0131f\u0131n\u0131n birden fazla \u00f6rne\u011fini olu\u015fturmak kaynak israf\u0131na ve potansiyel hatalara yol a\u00e7abilir. <code>DatabaseHelper<\/code> i\u00e7in bir Singleton modeli uygulamak, uygulama genelinde tek bir veritaban\u0131 ba\u011flant\u0131s\u0131 olmas\u0131n\u0131 sa\u011flar.<\/li>\n<li><strong>Kaynaklar\u0131 Kapatma:<\/strong> <code>SQLiteDatabase<\/code> ve <code>Cursor<\/code> nesnelerini kulland\u0131ktan sonra her zaman <code>close()<\/code> metodunu \u00e7a\u011f\u0131rarak kapatmay\u0131 unutmay\u0131n. Bu, bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131 ve kilitlenmeleri \u00f6nler.<\/li>\n<li><strong>Hata Y\u00f6netimi:<\/strong> Veritaban\u0131 i\u015flemleri s\u0131ras\u0131nda olu\u015fabilecek hatalar\u0131 (\u00f6rne\u011fin, veritaban\u0131 kilitlenmesi, disk dolu) uygun <code>try-catch<\/code> bloklar\u0131 ile y\u00f6netin.<\/li>\n<li><strong>Veritaban\u0131 \u0130ncelemesi:<\/strong> Geli\u015ftirme s\u0131ras\u0131nda veritaban\u0131n\u0131z\u0131n i\u00e7eri\u011fini incelemek i\u00e7in Android Studio&#8217;nun App Inspection arac\u0131n\u0131 veya <code>adb shell<\/code> komutlar\u0131n\u0131 kullanabilirsiniz. <code>adb shell<\/code> \u00fczerinden uygulaman\u0131z\u0131n veritaban\u0131 dosyas\u0131n\u0131 bulup <code>sqlite3<\/code> komutuyla inceleyebilirsiniz. Genellikle <code>\/data\/data\/com.your.package.name\/databases\/your_database_name.db<\/code> yolundad\u0131r.<\/li>\n<\/ul>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Bu rehberde, Android&#8217;de SQLite veritaban\u0131 ile \u00e7al\u0131\u015fman\u0131n temel ad\u0131mlar\u0131n\u0131 \u00f6\u011frendik. <code>SQLiteOpenHelper<\/code> s\u0131n\u0131f\u0131n\u0131 kullanarak bir veritaban\u0131 yard\u0131mc\u0131 s\u0131n\u0131f\u0131 olu\u015fturduk, g\u00f6revler i\u00e7in bir tablo tan\u0131mlad\u0131k ve CRUD i\u015flemlerini ger\u00e7ekle\u015ftiren metotlar\u0131 yazd\u0131k. Son olarak, bu veritaban\u0131 i\u015flemlerini bir Android etkinli\u011finde nas\u0131l kullanaca\u011f\u0131m\u0131z\u0131 g\u00f6sterdik ve baz\u0131 pratik ipu\u00e7lar\u0131 verdik.<\/p>\n<p>SQLite, Android uygulamalar\u0131nda yerel veri depolama i\u00e7in g\u00fc\u00e7l\u00fc ve esnek bir \u00e7\u00f6z\u00fcmd\u00fcr. Ancak daha b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalar i\u00e7in Google&#8217;\u0131n \u00f6nerdi\u011fi Room Persistence Library gibi soyutlama katmanlar\u0131n\u0131 kullanmak, veritaban\u0131 i\u015flemlerini daha g\u00fcvenli, daha test edilebilir ve daha kolay y\u00f6netilebilir hale getirecektir. Room, SQLite&#8217;\u0131n \u00fcst\u00fcne kurulmu\u015ftur ve SQL sorgular\u0131n\u0131 do\u011frudan yazmak yerine POJO (Plain Old Java Object) ve anotasyonlar kullanarak veritaban\u0131 i\u015flemlerini basitle\u015ftirir.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<h4>1. SQLite m\u0131 Room Persistence Library mi kullanmal\u0131y\u0131m?<\/h4>\n<p>Basit ve k\u00fc\u00e7\u00fck uygulamalar i\u00e7in do\u011frudan SQLite kullanmak yeterli olabilir. Ancak orta ve b\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalar, karma\u015f\u0131k sorgular veya daha iyi test edilebilirlik gerektiren durumlar i\u00e7in Room Persistence Library&#8217;yi kullanman\u0131z \u015fiddetle tavsiye edilir. Room, SQLite&#8217;\u0131n \u00fczerine bir soyutlama katman\u0131 ekler, derleme zaman\u0131 SQL sorgu do\u011frulamas\u0131, LiveData ve RxJava deste\u011fi gibi avantajlar sunar.<\/p>\n<h4>2. Veritaban\u0131 i\u015flemlerini ana i\u015f par\u00e7ac\u0131\u011f\u0131nda (UI thread) yapmak g\u00fcvenli midir?<\/h4>\n<p>Hay\u0131r, veritaban\u0131 i\u015flemleri (\u00f6zellikle yo\u011fun okuma\/yazma) ana i\u015f par\u00e7ac\u0131\u011f\u0131nda yap\u0131lmamal\u0131d\u0131r. Bu, uygulaman\u0131z\u0131n donmas\u0131na (ANR) neden olabilir. Her zaman arka plan i\u015f par\u00e7ac\u0131klar\u0131nda (\u00f6rn. Kotlin Coroutines, Java Executor, AsyncTask) yap\u0131lmal\u0131d\u0131r.<\/p>\n<h4>3. Veritaban\u0131 dosyas\u0131n\u0131 cihazda nerede bulabilirim?<\/h4>\n<p>Uygulaman\u0131z\u0131n veritaban\u0131 dosyas\u0131 genellikle cihaz\u0131n dahili depolamas\u0131nda <code>\/data\/data\/com.your.package.name\/databases\/your_database_name.db<\/code> yolunda bulunur. Bu konuma k\u00f6kl\u00fc (rooted) cihazlarda do\u011frudan veya Android Studio&#8217;nun &#8220;Device File Explorer&#8221; ya da &#8220;App Inspection&#8221; ara\u00e7lar\u0131n\u0131 kullanarak eri\u015febilirsiniz.<\/p>\n<h4>4. Veritaban\u0131 s\u00fcr\u00fcm\u00fc (DATABASE_VERSION) neden \u00f6nemlidir?<\/h4>\n<p><code>DATABASE_VERSION<\/code>, veritaban\u0131 \u015feman\u0131z\u0131n (tablo yap\u0131n\u0131z\u0131n) versiyonunu belirtir. Uygulaman\u0131z\u0131n yeni bir versiyonunda veritaban\u0131 yap\u0131s\u0131n\u0131 de\u011fi\u015ftirdi\u011finizde (yeni bir tablo ekleme, s\u00fctun ekleme\/silme vb.), bu s\u00fcr\u00fcm numaras\u0131n\u0131 art\u0131rman\u0131z gerekir. S\u00fcr\u00fcm numaras\u0131n\u0131 art\u0131rd\u0131\u011f\u0131n\u0131zda, <code>SQLiteOpenHelper<\/code>&#8216;\u0131n <code>onUpgrade()<\/code> metodu \u00e7a\u011fr\u0131l\u0131r ve bu metot i\u00e7inde eski \u015femadan yeni \u015femaya ge\u00e7i\u015f mant\u0131\u011f\u0131n\u0131 uygulayabilirsiniz. Bu, mevcut kullan\u0131c\u0131lar\u0131n verilerini kaybetmeden uygulaman\u0131z\u0131 g\u00fcncellemenizi sa\u011flar.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Android uygulamalar\u0131 geli\u015ftirirken veri depolama, uygulaman\u0131n temel ihtiya\u00e7lar\u0131ndan biridir. Kullan\u0131c\u0131 ayarlar\u0131, uygulama i\u00e7eri\u011fi veya \u00e7e","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1505],"tags":[],"class_list":{"0":"post-33116","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-sql-2","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>SQLite Veritaban\u0131 Temelleri ve Android Entegrasyonu - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/sqlite-veritabani-temelleri-ve-android-entegrasyonu\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"SQLite Veritaban\u0131 Temelleri ve Android Entegrasyonu\" \/>\n<meta property=\"og:description\" content=\"Android uygulamalar\u0131 geli\u015ftirirken veri depolama, uygulaman\u0131n temel ihtiya\u00e7lar\u0131ndan biridir. Kullan\u0131c\u0131 ayarlar\u0131, uygulama i\u00e7eri\u011fi veya \u00e7e\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/sqlite-veritabani-temelleri-ve-android-entegrasyonu\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-29T18:42:30+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/sqlite-veritabani-temelleri-ve-android-entegrasyonu\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/sqlite-veritabani-temelleri-ve-android-entegrasyonu\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"SQLite Veritaban\u0131 Temelleri ve Android Entegrasyonu\",\"datePublished\":\"2025-10-29T18:42:30+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/sqlite-veritabani-temelleri-ve-android-entegrasyonu\/\"},\"wordCount\":1574,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"SQL\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/sqlite-veritabani-temelleri-ve-android-entegrasyonu\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/sqlite-veritabani-temelleri-ve-android-entegrasyonu\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/sqlite-veritabani-temelleri-ve-android-entegrasyonu\/\",\"name\":\"SQLite Veritaban\u0131 Temelleri ve Android Entegrasyonu - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-29T18:42:30+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/sqlite-veritabani-temelleri-ve-android-entegrasyonu\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/sqlite-veritabani-temelleri-ve-android-entegrasyonu\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/sqlite-veritabani-temelleri-ve-android-entegrasyonu\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"SQLite Veritaban\u0131 Temelleri ve Android Entegrasyonu\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"SQLite Veritaban\u0131 Temelleri ve Android Entegrasyonu - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","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:\/\/fatihsoysal.com\/blog\/sqlite-veritabani-temelleri-ve-android-entegrasyonu\/","og_locale":"tr_TR","og_type":"article","og_title":"SQLite Veritaban\u0131 Temelleri ve Android Entegrasyonu","og_description":"Android uygulamalar\u0131 geli\u015ftirirken veri depolama, uygulaman\u0131n temel ihtiya\u00e7lar\u0131ndan biridir. Kullan\u0131c\u0131 ayarlar\u0131, uygulama i\u00e7eri\u011fi veya \u00e7e","og_url":"https:\/\/fatihsoysal.com\/blog\/sqlite-veritabani-temelleri-ve-android-entegrasyonu\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-29T18:42:30+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"13 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/sqlite-veritabani-temelleri-ve-android-entegrasyonu\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/sqlite-veritabani-temelleri-ve-android-entegrasyonu\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"SQLite Veritaban\u0131 Temelleri ve Android Entegrasyonu","datePublished":"2025-10-29T18:42:30+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/sqlite-veritabani-temelleri-ve-android-entegrasyonu\/"},"wordCount":1574,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["SQL"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/sqlite-veritabani-temelleri-ve-android-entegrasyonu\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/sqlite-veritabani-temelleri-ve-android-entegrasyonu\/","url":"https:\/\/fatihsoysal.com\/blog\/sqlite-veritabani-temelleri-ve-android-entegrasyonu\/","name":"SQLite Veritaban\u0131 Temelleri ve Android Entegrasyonu - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-29T18:42:30+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/sqlite-veritabani-temelleri-ve-android-entegrasyonu\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/sqlite-veritabani-temelleri-ve-android-entegrasyonu\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/sqlite-veritabani-temelleri-ve-android-entegrasyonu\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"SQLite Veritaban\u0131 Temelleri ve Android Entegrasyonu"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33116","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=33116"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33116\/revisions"}],"predecessor-version":[{"id":33117,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33116\/revisions\/33117"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33116"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33116"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33116"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}