12 Ekim 2015 Pazartesi

#ANDROID - Veritabanı Tüm İşlemler

  Hiç yorum yok
Sıra Android'in en önemli konularından birine geldi. Veritabanı işlemleri...

Öncelikle kullanacağımız layout ve class'lardan bahsedelim.

Projemize kisiler.xml, kisilerlistesi.xml, InsanlarDBUygulaması.java, TumKayitlar.java ve en önemlisi Veritabani.java dosyalarımızı ekliyoruz.

Bütün işlemlerimizi bu beş dosya üzerinde yapacağız.

Evet kisiler.xml tasarımımız bu şekilde olacak. Bu sayfada girilen ad soyad ve yaş bilgisini "Verileri Kaydet" butonuna tıklayarak veritabanına kaydedeceğiz.

"Verileri Getir" butonuna tıklandığında ise kisilerlistesi.xml layoutumuz açılacak, burada da veritabanındaki tüm kayıtlarımızı listeleyeceğiz.

Bunların altında yer alan EditText'e bir ID değeri gireceğiz ve "ID'ye Göre Ara" butonuna tıkladığımızda o ID'ye sahip ad soyad ve yaş bilgileri ekranın en üstünde yer alan EditText alanlarına yazdırılacak.

"ID'ye Göre Güncelle" ve "ID'ye Göre Sil" butonlarına tıklandığında ise yine girilen ID değerine göre güncelleme ve kaydı silme işlemlerini yapacağız.

Yukarıda "Verileri Getir" butonuna tıklandığında kisilerlistesi.xml sayfasının açılacağını belirtmiştik.

İşte bu sayfamızın (kisilerlistesi.xml) tasarımı da yandaki gibi olacak.

Burada veritabanımızdaki tüm verileri bir TextView'e yazdıracağız. İlgili TextView'in içerisinde şu anda "DB'den gelecek değerler..." yazıyor.

Şimdi kisiler.xml ve kisilerlistesi.xml layout dosyalarımızın kodlarını yazalım.

kisiler.xml dosyası:

<?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="wrap_content">

<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Adınız Soyadınız:"
android:textSize="20dp"/>

<EditText
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/etIsim"
android:hint="Adınızı ve soyadınızı girin..."
android:textSize="25dp"/>

<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Yaşınız:"
android:textSize="20dp"/>

<EditText
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/etYas"
android:hint="Yaşınızı girin..."
android:textSize="25dp"/>

<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Verileri Kaydet"
android:id="@+id/bVeriTabaninaKaydet"
android:textSize="20dp"
android:padding="15dp"
android:layout_marginTop="20dp"/>

<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Verileri Getir"
android:id="@+id/bVeriGetir"
android:textSize="20dp"
android:padding="15dp"/>

<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="number"
android:hint="ID değeri girin"
android:id="@+id/eTID" />

<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="ID'ye Göre Ara"
android:id="@+id/bIDgetir" />

<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="ID'ye Göre Güncelle"
android:id="@+id/bGuncelle" />

<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="ID'ye Göre Sil"
android:id="@+id/bSil" />

</LinearLayout>

kisilerlistesi.xml dosyası:

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

<TableLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal">

<TableRow
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/asfasf">

<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="İsimler"
android:layout_weight="1"
android:gravity="center"
android:textSize="25dp"
android:textColor="#CC0033"/>

<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Yaşlar"
android:layout_weight="1"
android:gravity="center"
android:textSize="25dp"
android:textColor="#CC0033"/>

</TableRow>

</TableLayout>

<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Dbden gelecek değerler..."
android:layout_marginTop="15dp"
android:id="@+id/tvTumKayitlar"/>

</LinearLayout>

Tasarımlarımızı oluşturduk şimdi sıra java dosyalarımıza yani class'larımıza geldi.

Öncelikle InsanlarDBUygulaması.java dosyamızı oluşturuyoruz.

InsanlarDBUygulaması.java dosyası:

package com.hakancengiz.blogders;

import android.app.Activity;
import android.app.Dialog;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class InsanlarDBUygulamasi extends Activity implements View.OnClickListener {

Button kaydet
, getir, idGetir, guncelle, sil;
EditText isimBilgisi
, yasBilgisi, girilenID;

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

kaydet
= (Button) findViewById(R.id.bVeriTabaninaKaydet);
getir
= (Button) findViewById(R.id.bVeriGetir);
isimBilgisi
= (EditText) findViewById(R.id.etIsim);
yasBilgisi
= (EditText) findViewById(R.id.etYas);

kaydet
.setOnClickListener(this);
getir
.setOnClickListener(this);

idGetir
= (Button) findViewById(R.id.bIDgetir);
guncelle
= (Button) findViewById(R.id.bGuncelle);
sil
= (Button) findViewById(R.id.bSil);
girilenID
= (EditText) findViewById(R.id.eTID);

idGetir
.setOnClickListener(this);
guncelle
.setOnClickListener(this);
sil
.setOnClickListener(this);
}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bVeriTabaninaKaydet:

String ad
= isimBilgisi.getText().toString();
String yas
= yasBilgisi.getText().toString();

try {
Veritabani db
= new Veritabani(InsanlarDBUygulamasi.this);
db
.baglantiyiAc();
db
.isimYasBilgisiniKaydet(ad, yas);
db
.baglantiyiKapat();
}
catch (Exception e) {
Dialog hata
= new Dialog(this);
hata
.setTitle("Ekleme İşlemi");
TextView tvHata
= new TextView(this);
tvHata
.setText(e.toString());
tvHata
.setPadding(10, 10, 10, 10);
hata
.setContentView(tvHata);
hata
.show();
}
finally {
Dialog dialog
= new Dialog(this);
dialog
.setTitle("Ekleme İşlemi");
TextView tvSonuc
= new TextView(this);
tvSonuc
.setText("Kayıt başarıyla gerçekleştirildi.");
tvSonuc
.setPadding(10, 10, 10, 10);
dialog
.setContentView(tvSonuc);
dialog
.show();
}

break;

case R.id.bVeriGetir:

Intent mainAc = new Intent(InsanlarDBUygulamasi.this, TumKayitlar.class);
startActivity(mainAc);


break;

case R.id.bIDgetir:

String id
= girilenID.getText().toString();
long aranacakID = Long.parseLong(id);
Veritabani db
= new Veritabani(InsanlarDBUygulamasi.this);
db
.baglantiyiAc();
String eldeEdilenIsim
= db.isimAl(aranacakID);
String eldeEdilenYas
= db.yasAl(aranacakID);
db
.baglantiyiKapat();

isimBilgisi
.setText(eldeEdilenIsim);
yasBilgisi
.setText(eldeEdilenYas);

break;

case R.id.bGuncelle:

String adGuncelle
= isimBilgisi.getText().toString();
String yasGuncelle
= yasBilgisi.getText().toString();
String idGuncelle
= girilenID.getText().toString();

long guncellenecekID = Long.parseLong(idGuncelle);

Veritabani dbGuncelle
= new Veritabani(InsanlarDBUygulamasi.this);
dbGuncelle
.baglantiyiAc();
dbGuncelle
.kaydiGuncelle(guncellenecekID, adGuncelle, yasGuncelle);
dbGuncelle
.baglantiyiKapat();

break;

case R.id.bSil:

String silinecekKayit
= girilenID.getText().toString();
long silinecekID = Long.parseLong(silinecekKayit);
Veritabani dbSil
= new Veritabani(InsanlarDBUygulamasi.this);
dbSil
.baglantiyiAc();
dbSil
.kaydiSil(silinecekID);
dbSil
.baglantiyiKapat();

break;
}
}
}

Burada kisiler.xml layoutumuzu sınıfımıza bağladık. Önemli noktalar butonlara tıklandıktan sonra olacaklar. Onlara şimdi değil Veritabanı.java dosyamızı oluşturduktan sonra değineceğiz.

Ardından hemen TumKayitlar.java dosyamızı oluşturuyoruz.

TumKayitlar.java dosyası:

package com.hakancengiz.blogders;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class TumKayitlar extends Activity {

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

TextView tv = (TextView) findViewById(R.id.tvTumKayitlar);

Veritabani db = new Veritabani(TumKayitlar.this);
db.baglantiyiAc();
String tumKayitlar = db.tumKayitlar();
db.baglantiyiKapat();

tv.setText(tumKayitlar);

}
}

Yine bu class'ımızda da Veritabani.java dışında değinmemiz gereken bir şey yok.

Oluşturduğumuz iki java dosyasında da (InsanlarDBUygulamasi ve TumKayitlar) gördüğünüz gibi Veritabani.java dosyamızdan nesne üretip yine onun içerisindeki metodları kullanarak bağlantı açıp, yine Veritabani.java içersinde oluşturacağımız ilgili metoda gidip, bağlantı kapatıp veriyi ekrana yazdırıyoruz.

Kısacası veritabanıyla ilgili yapacağımız her türlü işlemi biz Veritabani.java dosyamızda yapacağız. Bu dosya sadece veritabanının tablolarını, sütunlarını oluşturmaktan ibaret olmayacak. Her türlü ekleme, silme ve güncelleme işlemini yine bu dosyanın içerisine oluşturacağımız metodlar sayesinde yapacağız.

Şimdi Veritabani.java dosyamızı oluşturalım.

Veritabani.java dosyası:

package com.hakancengiz.blogders;

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

public class Veritabani {

private static final String DATABASE_ISIM = "egitimdb";
private static final String DATABASE_TABLO = "insanlar";
private static final int DATABASE_VERSION = 1;

//Veritabanını kullanacak sınıfları tutan Context nesnesi
private final Context contextim;
//Oluşturduğumuz veritabanıyardımcı sınıfının nesnesi
private VeritabaniHelper veritabanihelper;
//Veritabanımızın nesnesi
private SQLiteDatabase veritabanim;

// Oluşturulacak insanlar tablosunun sütunları
public static final String KEY_ROW_ID = "_id";
public static final String KEY_ISIM = "isim";
public static final String KEY_YAS = "yas";

public Veritabani(Context c) {
this.contextim = c;
}

public Veritabani baglantiyiAc() throws SQLException {

veritabanihelper = new VeritabaniHelper(contextim);
veritabanim = veritabanihelper.getWritableDatabase();

return this;

}

public void baglantiyiKapat() {

veritabanihelper.close();

}

private static class VeritabaniHelper extends SQLiteOpenHelper {

public VeritabaniHelper(Context contextim) {
super(contextim, DATABASE_ISIM, null, DATABASE_VERSION);

}

@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL("CREATE TABLE " + DATABASE_TABLO + " (" + KEY_ROW_ID
+ " INTEGER PRIMARY KEY AUTOINCREMENT , " + KEY_ISIM
+ " TEXT NOT NULL, " + KEY_YAS + " TEXT NOT NULL);");

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub

db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLO);
onCreate(db);

}

}

public long isimYasBilgisiniKaydet(String ad, String yas) {
// TODO Auto-generated method stub
ContentValues cv = new ContentValues();

cv.put(KEY_ISIM, ad);
cv.put(KEY_YAS, yas);

return veritabanim.insert(DATABASE_TABLO, null, cv);

}

public String tumKayitlar() {

String[] sutunlar = new String[]{KEY_ROW_ID, KEY_ISIM, KEY_YAS};
Cursor c = veritabanim.query(DATABASE_TABLO, sutunlar, null, null, null, null, null);

String tumKayitlar = "";

int idSiraNo = c.getColumnIndex(KEY_ROW_ID);
int isimSiraNo = c.getColumnIndex(KEY_ISIM);
int yasSiraNo = c.getColumnIndex(KEY_YAS);

for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext())
{
tumKayitlar = tumKayitlar + c.getString(idSiraNo) + "\t" + c.getString(isimSiraNo) + "\t" + c.getString(yasSiraNo) + "\n";
}

return tumKayitlar;
}

public String isimAl(long aranacakID) {

String[] sutunlar = new String[]{KEY_ROW_ID, KEY_ISIM, KEY_YAS};
Cursor c = veritabanim.query(DATABASE_TABLO, sutunlar, KEY_ROW_ID + "=" + aranacakID, null, null, null, null);

if(c!=null)
{
c.moveToFirst();
String isim = c.getString(1);
return isim;
}

return null;
}

public String yasAl(long aranacakID) {

String[] sutunlar = new String[]{KEY_ROW_ID, KEY_ISIM, KEY_YAS};
Cursor c = veritabanim.query(DATABASE_TABLO, sutunlar, KEY_ROW_ID + "=" + aranacakID, null, null, null, null);

if(c!=null)
{
c.moveToFirst();
String yas = c.getString(2);
return yas;
}

return null;
}

public void kaydiGuncelle(long guncellenecekID, String adGuncelle, String yasGuncelle) {

ContentValues cvGuncelle = new ContentValues();
cvGuncelle.put(KEY_ISIM, adGuncelle);
cvGuncelle.put(KEY_YAS, yasGuncelle);

veritabanim.update(DATABASE_TABLO, cvGuncelle, KEY_ROW_ID + "=" + guncellenecekID, null);

}

public void kaydiSil(long silinecekID) {

veritabanim.delete(DATABASE_TABLO, KEY_ROW_ID + "=" + silinecekID, null);

}

}

Öncelikle veritabanımızın adını belirliyoruz. Bizim veritabanı adımız "egitimdb" olacak. Bu veritabanımızda tek tablo üzerinden işlem yapacağız o tablomuzun adı da "insanlar" tablosu olacak.

Dipnot: Veritabanınızda bir değişiklik yaptığınızda DATABASE_VERSION sayısını yükseltmeniz gerekir. Aksi takdirde hata alırsınız.

Daha sonra insanlar tablomuzun sütunlarını belirliyoruz. Bizim sütunlarımız id, isim ve yas şeklinde.

Veritabanını oluşturma, baglantiyiAc(), baglantiyiKapat(), isimYasBilgisiniKaydet(), tumKayitlar()... diye devam eden oluşturduğumuz tüm metodlar zaten kalıp kodlar halinde kullanılıyorlar. Bize ne zaman lazım olursa bu kodları kopyalayıp rahatlıkla kullanabiliriz. Ezberlememiz gereken çokta bir şey yok.

Son olarak oluşturduğumuz InsanlarDBUygulamasi ve TümKayitlar java dosylarımızı AndoridManifest.xml dosyamızın içerisinde tanıtıyoruz.

        <activity
android:name=".InsanlarDBUygulamasi"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.INSANLARDBUYGULAMASI" />

<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>

<activity
android:name=".TumKayitlar"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.TUMKAYITLAR" />

<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>

Hiç yorum yok :

Yorum Gönder