"Enter"a basıp içeriğe geçin

Android Studio SQLite Veritabanına Kaydedilen Verileri Ayrı Activity Üzerinden Okuma Ders #6

Son kaldığımız yerde veritabanı dosyasının nereye kaydedildiğini ve bunun nasıl açılacağını göstermiştim. O yazıya aşağıdan gidebilirsiniz.

Android Studio SqLite Veritabanı Nereye Kaydediyor? Veritabanı Dosyası Nerede? Device File Explorer Ders #5

Bu konumuzda ise yeni bir activity oluşturup içerisinde bulunan TextView üstüne veritabanındaki tüm verileri yazdıracağız. Ayrı bir activity üzerinden göstereceğimiz için yeni bir activity oluşturalım. Bunu Java kodlarının bulunduğu klasör üzerinden yapın. New -> Activity -> Empty Activity seçip adını Listele yapalım.

activity_listele.xml üzerinde yoksa bir tane TextView ekleyin. ID değerini tv yapın. Text kısmında ConstraintLayout kısmını silip yerine LinearLayout ekleyin. Orientation değerini Vertical verin. Design altında Component Tree kısmında aşağıdaki yapıyı sağlayın. Çok veri ekleyince aşağı kaydırmayı sağlayacak ScrollView ekledik.

<TextView
    android:id="@+id/tv"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Veriler" />

Listele sınıfı içerisine (onCreate üzerine) tanımlama işlemini yapalım.

TextView tv;

onCreate içerisine tanımlamasınıda yapalım.

tv = findViewById(R.id.tv);

activity_main.xml üzerinde tasarıma bir buton daha ekleyelim ve id değerini btn_listele yapalım.

<Button
    android:id="@+id/btn_listele"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Listele" 
    android:onClick="butonaDokunuldu"/>

MainActivity.Java dosyasına gelelim. ButonaDokunuldu metodunda ikinci bir case açacağız. Bu ikinci case sağlandığında oluşturduğumuz yeni activity açılacak ve listeleme işlemi gerçekleşecek.

case R.id.btn_listele:
    
    break;

Yeni oluşturduğumuz activitye yönlendirmek için Intent sınıfını kullanacağız. Birinci parametre bulunduğumuz sınıfı temsil ediyor. İkincisi verilerin taşınacağı sınıfı temsil ediyor.

Intent intent = new Intent(getApplicationContext(), Listele.class);

startActivity ile oluşturulan activitye gidelim.

startActivity(intent);

Listele için kullanılan case’in son durumu:

case R.id.btn_listele:
    Intent intent = new Intent(getApplicationContext(), Listele.class);
    startActivity(intent);
    break;

Listele.Java dosyasına gelelim. onCreate içerisinde veritabanı bağlantısını yapalım.

Veritabani vt = new Veritabani(getApplicationContext());

Veritabanından çekecilecek verileri dinamik olsun diye bir tane liste oluşturup onun içerisine kaydedeceğiz. Dizilere kaydetseydik tanımlama yaparken boyutunu belirtmek gerekiyor. List kullanıldığında ne kadar veri gelirse o kadar büyüyor. Kisiler ise oluşturulan diğer sınıfın adı.

List<Kisiler> kisilerList = new ArrayList<Kisiler>();

Veritabanından gelen kayıtları bu listeye aktarmak için:

kisilerList = vt.TumKayitlariGetir();

Tanımlamasını yapalım. TumKayitlariGetir üzerinde Alt+Enter ile Veritabanına otomatik olarak metodu oluşturmasını sağlayalım. Veritabanı sınıfında böyle bir kod bloku otomatik oluşacak.

public List<Kisiler> TumKayitlariGetir() {
    
}

Burada verdiği hata, geriye değer döndürmek için beklemesinden kaynaklanıyor. Hatanın şimdilik gitmesi için null değer döndürelim.

return null;

Sadece okunabilir veritabanı bağlantısı oluşturalım.

SQLiteDatabase vt = this.getReadableDatabase();

Yazdırılacak sütunları seçmek için bir tane dizi oluşturacağız. Bunun nedeni görselde id ile işimiz olmaması.

String[] sutunlar = new String[]{"Ad", "Soyad"};

Tüm verilerde dolaşmak için bir tane Cursor tanımlayalım. Birinci parametre dolaşacağı tablonun adı. İkinci parametre sütunların adı. Yukarıda tanımlamak yerine new String[]{"Ad", "Soyad"} yazarak tanımlama yapılabilirdi. Kod kalabalığı istemiyorsanız böyle yapabilirsiniz.

Cursor c = vt.query(AJANDA_TABLE, sutunlar, null,null,null,null,null);
// Diğer kullanım:
// Cursor c = vt.query(AJANDA_TABLE, new String[]{"Ad", "Soyad"}, null,null,null,null,null);

En sonda bulunan null değeri Order By karşılığı oluyor. Büyükten küçüğe yada zıttı veya a’dan z’ye yada zıttı şeklinde sıralamalar yapmak mümkün. vt.query yerine SQL kodu bilginiz varsa vt.rawQuery kullanabilirsiniz.

Sütun bilgilerini almak için index numarasına ihtiyaç var.

int adsirano = c.getColumnIndex(ROW_AD);
int soyadsirano = c.getColumnIndex(ROW_SOYAD);

Metodumuz List tipinde bir geri dönüş bekliyor. Bunun için bir tane List sınıfı oluşturalım. Tüm kayıtları içerisine kaydedelim ve geri döndürerek Listele sınıfında kullanıma hazırlayalım.

List<Kisiler> kisilerList = new ArrayList<Kisiler>();

İlk kayıttan son kayıt kalmayana diye bir tane for döngüsü oluşturacağız. for(ilkKayıt; !sonKayıtOlmayanaKadar; sonrakiKayıt).

for(c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){
    
}

Veritabanından alıp kisilere aktarıyoruz.

Kisiler kisiler = new Kisiler();
kisiler.setAd(c.getString(adsirano));
kisiler.setSoyAd(c.getString(soyadsirano));

Aldıklarımızı listeye aktaralım. Böylelikle for döngüsü bitiyor.

kisilerList.add(kisiler);

Veritabanı bağlantısını kapatalım ve return değerini kisilerList olarak değiştirelim.

vt.close();
return kisilerList;

Listele.Java dosyasına gelelim. Burada yazdırmak için String yerine StringBuilder kullanacağız. Bu String’e göre daha performanslıdır.

StringBuilder stringBuilder = new StringBuilder();

For döngüsü ile veritabanından dönen kisilerList’i kullanalım.

for(Kisiler kisiler : kisilerList){
    
}

stringBuilder’e for içerisinde değerleri ekleyelim.

stringBuilder.append(kisiler.getAd()+"\n"+kisiler.getSoyAd()+"\n\n");

For döngüsünü kapatalım ve aldığımız değerleri TextView nesnesine yazdıralım.

tv.setText(stringBuilder);

Veritabanında bir kayıt bulunmaması halinde uygulama çökecektir. Bunu engellemek için try catch bloğu içine alacağız ve TextView nesnesine Kayıt Bulunamadı yazdıracağız. Son durum şöyle:

Listele.Java

package com.example.osman.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class Listele extends AppCompatActivity {

    TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_listele);
        
        tv = findViewById(R.id.tv);
        
        try{
            Veritabani vt = new Veritabani(getApplicationContext());
            List<Kisiler> kisilerList = new ArrayList<Kisiler>();
            kisilerList = vt.TumKayitlariGetir();
            StringBuilder stringBuilder = new StringBuilder();
            for(Kisiler kisiler : kisilerList){
                stringBuilder.append(kisiler.getAd()+"\n"+kisiler.getSoyAd()+"\n\n");
            }
            tv.setText(stringBuilder);
        }
        catch(Exception e){
            tv.setText("Kayıt Bulunamadı!"+e);
        }
    }
}

activtiy_listele.xml son durum:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Listele"
    android:orientation="vertical">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <TextView
                android:id="@+id/tv"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Veriler" />
        </LinearLayout>
    </ScrollView>

</LinearLayout>

MainActivity.Java son durum:

package com.example.osman.myapplication;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    EditText et_ad, et_soyad;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        et_ad = findViewById(R.id.et_ad);
        et_soyad = findViewById(R.id.et_soyad);
    }

    public void butonaDokunuldu(View view) {
        switch (view.getId()) {
            case R.id.btn_kaydet:
                String ad = et_ad.getText().toString();
                String soyad = et_soyad.getText().toString();

                Kisiler kisiler = new Kisiler(ad, soyad);
                try {
                    Veritabani veritabani = new Veritabani(getApplicationContext());
                    long id = veritabani.KayitEkle(kisiler);
                    veritabani.KayitEkle(kisiler);
                    if (id == -1) {
                        Toast.makeText(this, "Kayıt İşleminde Bir Hata Oluştu.", Toast.LENGTH_SHORT).show();
                    }
                    else {
                        Toast.makeText(this, "Kayıt Başarılı.", Toast.LENGTH_SHORT).show();
                    }
                }
                catch (Exception e) {
                    Toast.makeText(this, "Hata.", Toast.LENGTH_SHORT).show();
                }
                et_ad.setText("");
                et_soyad.setText("");
                break;

            case R.id.btn_listele:
                Intent intent = new Intent(getApplicationContext(), Listele.class);
                startActivity(intent);
                break;
        }
    }
}

Veritabani.Java son durum:

package com.example.osman.myapplication;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import java.util.ArrayList;
import java.util.List;

public class Veritabani extends SQLiteOpenHelper {

    private static final String DATABASE_NAME = "Ajanda";
    private static final int DATABASE_VERSION = 1;
    private static final String AJANDA_TABLE = "AjandaTablo";

    private static final String ROW_ID = "ID";
    private static final String ROW_AD = "AD";
    private static final String ROW_SOYAD = "SOYAD";

    public Veritabani(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE "+AJANDA_TABLE+" ("+ROW_ID+" INTEGER PRIMARY KEY, "+ROW_AD+" TEXT NOT NULL, "+ROW_SOYAD+" TEXT NOT NULL)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS "+AJANDA_TABLE);
        onCreate(db);
    }


    public long KayitEkle(Kisiler kisiler) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues cv = new ContentValues();
        cv.put(ROW_AD, kisiler.getAd());
        cv.put(ROW_SOYAD, kisiler.getSoyAd());
        long id = db.insert(AJANDA_TABLE, null, cv);
        db.insert(AJANDA_TABLE, null, cv);
        db.close();
        return id;
    }

    public List<Kisiler> TumKayitlariGetir() {
        SQLiteDatabase vt = this.getReadableDatabase();
        String[] sutunlar = new String[]{ROW_AD, ROW_SOYAD};
        Cursor c = vt.query(AJANDA_TABLE, sutunlar, null,null,null,null,null);
        int adsirano = c.getColumnIndex(ROW_AD);
        int soyadsirano = c.getColumnIndex(ROW_SOYAD);
        List<Kisiler> kisilerList = new ArrayList<Kisiler>();
        for(c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){
            Kisiler kisiler = new Kisiler();
            kisiler.setAd(c.getString(adsirano));
            kisiler.setSoyAd(c.getString(soyadsirano));
            kisilerList.add(kisiler);
        }
        vt.close();
        return kisilerList;
    }
}

Kaynak Kodları: https://drive.google.com/open?id=15ydh8W66ErzpGe2OEPShpYuEKPAiFP3E

Buraya kadar geldiğiniz için tebrikler. Artık bir tane uygulama yazmış oldunuz. Geriye test etmesi kaldı. Başka derslerde görüşmek üzere  😉 .

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.