Android SQLite Database Kullanımı (select-insert-update-delete)

Merhaba arkadaşlar bu dersimizde Android de SQLite Veritabanı kullanmayı anlatmaya çalışacağım. Hepimizin malumudir ki yapmak istediğimiz yada yaptığımız uygulamalarda bazı verileri saklama ihtiyacı duyarız.Bunun da en güzel yolu elbetteki veritabanıdır.

NOT : Dersi hazırlarken eclipse ile hazırlamıştık. Kaynak kod içinde hem eclipse projesini hemde Android Studio projesini bulabilirsiniz.
Sqlite kullanımı oldukça kolay bir veri tabanı sistemidir. Küçük boyutu ve hızlı yapısı sayesinde mobil cihazlarda kullanımı oldukça yaygındır. Sqlite birçok programlama diliyle birlikte kullanılabilir.
Bu dersimizde ActionBar kullandığım için min sdk versiyonumuzu 11(Android 3.0) seçtik.Eğer ActionBarı API 11 in altında kullanmak isterseniz Support Library indirip projemize dahil ediyoruz. ActionBar konusunu daha sonra detaylıca anlatacağım.
Şimdi sqlite veritabanına geri dönelim. Daha İyi anlamamız için küçük bir uygulama yazdım. Bu uygulamada veritabanında sqlite_database adında bir veritabanı oluşturdum.İçinde kitap_listesi adında bir tablo var. Uygulama içinden bu tabloya kitap ekleyip,kitap silebiliyor ve var olanı kitabı güncelleyebiliyoruz(update).
Şimdi uygulamanın kodlarına geçelim.Öncellikle oluşturuken api 11 muhabbetine dikkat edelim.
sqllitedatabase

Arkadaşlar Kaynak Kodu İndirip uygulamayı çalıştırırsanız anlamanız çok daha kolay olucaktır.

Öncelikle Database Classı inceleyelim.

import java.util.ArrayList;
import java.util.HashMap;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class Database extends SQLiteOpenHelper {

	// Database Version
	private static final int DATABASE_VERSION = 1;

	// Database Name
	private static final String DATABASE_NAME = "sqllite_database";//database adı

	private static final String TABLE_NAME = "kitap_listesi";
	private static String KITAP_ADI = "kitap_adi";
	private static String KITAP_ID = "id";
	private static String KITAP_YAZARI = "yazar";
	private static String KITAP_BASIM_YILI = "yil";
	private static String KITAP_FIYATI = "fiyat";

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

	@Override
	public void onCreate(SQLiteDatabase db) {  // Databesi oluşturuyoruz.Bu methodu biz çağırmıyoruz. Databese de obje oluşturduğumuzda otamatik çağırılıyor.
		String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + "("
				+ KITAP_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
				+ KITAP_ADI + " TEXT,"
				+ KITAP_YAZARI + " TEXT,"
				+ KITAP_BASIM_YILI + " TEXT,"
				+ KITAP_FIYATI + " TEXT" + ")";
		db.execSQL(CREATE_TABLE);
	}

	public void kitapSil(int id){ //id si belli olan row u silmek için

		 SQLiteDatabase db = this.getWritableDatabase();
		 db.delete(TABLE_NAME, KITAP_ID + " = ?",
		            new String[] { String.valueOf(id) });
		 db.close();
	}

	public void kitapEkle(String kitap_adi, String kitap_yazari,String kitap_basim_yili,String kitap_fiyat) {
		//kitapEkle methodu ise adı üstünde Databese veri eklemek için
		SQLiteDatabase db = this.getWritableDatabase();
		ContentValues values = new ContentValues();
		values.put(KITAP_ADI, kitap_adi);
		values.put(KITAP_YAZARI, kitap_yazari);
		values.put(KITAP_BASIM_YILI, kitap_basim_yili);
		values.put(KITAP_FIYATI, kitap_fiyat);

		db.insert(TABLE_NAME, null, values);
		db.close(); //Database Bağlantısını kapattık*/
	}

	public HashMap<String, String> kitapDetay(int id){
		//Databeseden id si belli olan row u çekmek için.
                //Bu methodda sadece tek row değerleri alınır.
		//HashMap bir çift boyutlu arraydir.anahtar-değer ikililerini bir arada tutmak için tasarlanmıştır.
		//map.put("x","300"); mesala burda anahtar x değeri 300.

		HashMap<String,String> kitap = new HashMap<String,String>();
		String selectQuery = "SELECT * FROM " + TABLE_NAME+ " WHERE id="+id;

        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);
        // Move to first row
        cursor.moveToFirst();
        if(cursor.getCount() > 0){
        	kitap.put(KITAP_ADI, cursor.getString(1));
        	kitap.put(KITAP_YAZARI, cursor.getString(2));
        	kitap.put(KITAP_BASIM_YILI, cursor.getString(3));
        	kitap.put(KITAP_FIYATI, cursor.getString(4));
        }
        cursor.close();
        db.close();
		// return kitap
		return kitap;
	}

	public  ArrayList<HashMap<String, String>> kitaplar(){

		//Bu methodda ise tablodaki tüm değerleri alıyoruz
		//ArrayList adı üstünde Array lerin listelendiği bir Array.Burda hashmapleri listeleyeceğiz
		//Herbir satırı değer ve value ile hashmap a atıyoruz. Her bir satır 1 tane hashmap arrayı demek.
		//olusturdugumuz tüm hashmapleri ArrayList e atıp geri dönüyoruz(return).

		SQLiteDatabase db = this.getReadableDatabase();
		String selectQuery = "SELECT * FROM " + TABLE_NAME;
		Cursor cursor = db.rawQuery(selectQuery, null);
	    ArrayList<HashMap<String, String>> kitaplist = new ArrayList<HashMap<String, String>>();
	    // looping through all rows and adding to list

	    if (cursor.moveToFirst()) {
	        do {
	            HashMap<String, String> map = new HashMap<String, String>();
	            for(int i=0; i<cursor.getColumnCount();i++)
	            {
	                map.put(cursor.getColumnName(i), cursor.getString(i));
	            }

	            kitaplist.add(map);
	        } while (cursor.moveToNext());
	    }
	    db.close();
	    // return kitap liste
	    return kitaplist;
	}

	public void kitapDuzenle(String kitap_adi, String kitap_yazari,String kitap_basim_yili,String kitap_fiyat,int id) {
	    SQLiteDatabase db = this.getWritableDatabase();
	    //Bu methodda ise var olan veriyi güncelliyoruz(update)
	    ContentValues values = new ContentValues();
	    values.put(KITAP_ADI, kitap_adi);
		values.put(KITAP_YAZARI, kitap_yazari);
		values.put(KITAP_BASIM_YILI, kitap_basim_yili);
		values.put(KITAP_FIYATI, kitap_fiyat);

	    // updating row
	    db.update(TABLE_NAME, values, KITAP_ID + " = ?",
	            new String[] { String.valueOf(id) });
	}

	public int getRowCount() {
		// Bu method bu uygulamada kullanılmıyor ama her zaman lazım olabilir.Tablodaki row sayısını geri döner.
		//Login uygulamasında kullanacağız
		String countQuery = "SELECT  * FROM " + TABLE_NAME;
		SQLiteDatabase db = this.getReadableDatabase();
		Cursor cursor = db.rawQuery(countQuery, null);
		int rowCount = cursor.getCount();
		db.close();
		cursor.close();
		// return row count
		return rowCount;
	}

	public void resetTables(){
		//Bunuda uygulamada kullanmıyoruz. Tüm verileri siler. tabloyu resetler.
		SQLiteDatabase db = this.getWritableDatabase();
		// Delete All Rows
		db.delete(TABLE_NAME, null, null);
		db.close();
	}

	@Override
	public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
		// TODO Auto-generated method stub

	}

}

Şimdide MainActivity Classı inceleyelim ve Database classdaki metodları nasıl kullandığımıza bakalım.

import java.util.ArrayList;
import java.util.HashMap;
import com.mobilhanem.sqlliteexample.R;
import android.os.Bundle;
import android.app.ActionBar;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends Activity {

	ListView lv;
	ArrayAdapter adapter;
	ArrayList<HashMap<String, String>> kitap_liste;
	String kitap_adlari[];
	int kitap_idler[];
	protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

        ActionBar actionBar = getActionBar();
	    actionBar.setDisplayHomeAsUpEnabled(false);
	}

	public void onResume()
    {   //neden onResume metodu kullandığımı ders içinde anlattım.
    super.onResume();
    Database db = new Database(getApplicationContext()); // Db bağlantısı oluşturuyoruz. İlk seferde database oluşturulur.
    kitap_liste = db.kitaplar();//kitap listesini alıyoruz
    if(kitap_liste.size()==0){//kitap listesi boşsa
   	 Toast.makeText(getApplicationContext(), "Henüz Kitap Eklenmemiş.\nYukarıdaki + Butonundan Ekleyiniz", Toast.LENGTH_LONG).show();
    }else{
	     kitap_adlari = new String[kitap_liste.size()]; // kitap adlarını tutucamız string arrayi olusturduk.
	     kitap_idler = new int[kitap_liste.size()]; // kitap id lerini tutucamız string arrayi olusturduk.
	     for(int i=0;i<kitap_liste.size();i++){
	    	 kitap_adlari[i] = kitap_liste.get(i).get("kitap_adi");
	    	 //kitap_liste.get(0) bize arraylist içindeki ilk hashmap arrayini döner. Yani tablomuzdaki ilk satır değerlerini
	    	 //kitap_liste.get(0).get("kitap_adi") //bize arraylist içindeki ilk hashmap arrayin anahtarı kitap_adi olan value döner

	    	 kitap_idler[i] = Integer.parseInt(kitap_liste.get(i).get("id"));
	    	//Yukarıdaki ile aynı tek farkı değerleri integer a çevirdik.
	     }
	     //Kitapları Listeliyoruz ve bu listeye listener atıyoruz
	     lv = (ListView) findViewById(R.id.list_view);

	     adapter = new ArrayAdapter(this, R.layout.list_item, R.id.kitap_adi, kitap_adlari);
	     lv.setAdapter(adapter);

	     lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
	 		public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
	 				long arg3) {
	 			//Listedeki her hangibir yere tıklandıgında tıklanan satırın sırasını alıyoruz.
	 			//Bu sıra id arraydeki sırayla aynı oldugundan tıklanan satırda bulunan kitapın id sini alıyor ve kitap detaya gönderiyoruz.
	 			 Intent intent = new Intent(getApplicationContext(), KitapDetay.class);
	 			 intent.putExtra("id", (int)kitap_idler[arg2]);
	             startActivity(intent);

	 		}
	     });
    }

    }

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);

		return super.onCreateOptionsMenu(menu);
	}
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
	    // Handle presses on the action bar items
	    switch (item.getItemId()) {
	        case R.id.ekle:
	        	KitapEkle();
	            return true;
	        default:
	            return super.onOptionsItemSelected(item);
	    }
	}

	 private void KitapEkle() {
	        Intent i = new Intent(MainActivity.this, KitapEkle.class);
	        startActivity(i);
	    }
}

Arkadaşlar gerekli açıklamaları zaten kod üzerinde yaptım. Diğer KitapEkle ve KitapDuzenle classını kaynak kodu indirerek inceleyebilirsiniz. Bu class lardaki gerekli açıklamalarıda kod üzerinnde yaptım.

Burada üzerinde duracağım nokta MainActivity de neden işlemleri onCreate() methodunda yapmadım da onResume() methodunda yaptığım. Arkadaşlar bu durumu şöyle açıklayayım. Elimizde A ve B activity leri var. A activity sinden B activity sine geçiş yaptığımızda eğer A activtysini finish() methodu ile öldürmediysek B activitysinden Back butonu veya ActionBar dan geri gel butonuyla geri geldiğimizde A activty si olduğu gibi durur ve yeniden yaratılmaz. Ama bizim bu uygulamamızda Kitap Listesindeki kitapları silebilir veya değiştirebiliriz. Örneğin uygulamayı ilk actık kitapları listeledik ve KitapDetay classından kitabı sildik.Ama geri MainActivity e geldiğimizde baştan yüklenmiyeceği için kitap duruyor gözükecektir. İşte burda onResume() methodu bizim işimize yarıyor. Bu method bulunduğu class her açıldığında çalışır. İster ilk açılıyor olsun isterse Back butonuyla geri gelinmiş olsun her zaman çalışır.
Evet arkadaşlar bu derste anlatmak istediklerim bu kadar.Oluşturduğumuz bu database verilerini ,yapısını,yada doğru oluşturup oluşturmadığımızı kontrol etmek için bu dersimize göz atınız.Paylaştığım bu derslerin benzerlerinide İos platformu için de yine örnek uygulamalarla anlatmaya çalışacağım. Bir dahaki dersimizde Android de Splash Secreen(Açılış Sayfası) yapımını anlatacağım.Arkadaşlar bu dersle ilgili aklınıza takılan yada anlamadığınız yerleri sorabilirsiniz. Müsait olduğum zamanlar cevaplamaya çalışacağım. O zamana kadar kendinize iyi bakın ve destek için bu dersleri aşağıdaki linklerden paylaşın.

Tüm Android Ders, Proje ve Kaynak Kodlar için tıklayınız.

24

Taha Kırca

iOS & Android & Apple Watch Developer, Mobilhanem.com yazarı, Karadeniz Uşağu, Ordu Sevdalısı

116 Yorum

  • MERHBA BN SİZİN UYGULAMNIZI İNDİRDİM SQL TABLOLARINI KENDİNİ ME GÖRE DÜZENLEDİM “ÇALIŞMAYI DURDURDU HATASI” ALDIM YARDIMCI OLURSANIZ SEVİNİRİM

    • indirdiğiniz uygulamada mı bu hatayı aldınız yoksa kendiniz tablolar üzerinde oynadıktan sonra mı bu hatayı alıyorsunuz??

      • Şİmdi öncelikle mail adresinizi nerden alabilirim, Ben kendime göre düzenlediğimde 5 6 tane daha edittext ekledim onları database koydum giriyorum kayıt yap diyorum toast measj ile veritabanına eklendi diyor fakat en baş sayfada bir türlü gelmiyor. Sizin göndirdiğiniz 4 tane database tablosunu kulandığımda baş sayfa isimler geliyor. Tam olarak anlatabildin mi, sizin dışınızda bir edittext daha eklediğim de onu veritabanına kaydetebiliyorum fakat onu nasıl göstereceğim.

        • Acaba siz bir kitap yilinin altına atıyorum yasi değerini girip onu ekleyebilirmisiniz böyle bende nerelerde değişiklik yaptığınızı anlayabilirim benim gibi muzdarıp olan çok insan vardır. Ayrıca dediğiniz gibi eğer bu dediğime vaktiniz yoksa ben mail adresinizi alıp size projemide gönderebilirm.

          • Büyük ihtimal eklerken sorun oluyor. Ekleyip eklemediğini bir sqlite manager ile yada yada firefoxun sqlite manager eklentisi ile inceleyebilirsiniz.

      • Herşeyi yaptım hala çözüm bulamadım, bu benim mail adresim [email protected] oraya bir selam yazarsan şu projeyi bir göndereyim bak yetişmesi lazım ve ben daha bu veritabanı sıkıntı çıkartdığından hiçbirşey ekliyemedim.Sana zahmet.

    • Hatalarını yazıorm
      Kitapekle.java 29.satır:
      e4 = (EditText)findViewById(R.id.editText5); // bastaki e4 değil e5 olacak

      Database.java

      onCreate metodunu yanlıs yapmıssın

      @Override
      public void onCreate(SQLiteDatabase db) { // Databesi oluşturuyoruz.Bu methodu biz çağırmıyoruz. Databese de obje oluşturduğumuzda otamatik çağırılıyor.
      String CREATE_TABLE = “CREATE TABLE ” + TABLE_NAME + “(”
      + KITAP_ID + ” INTEGER PRIMARY KEY AUTOINCREMENT,”
      + KITAP_ADI + ” TEXT,”
      + KITAP_YAZARI + ” TEXT,”
      + KITAP_BASIM_YILI + ” TEXT,”
      + KITAP_FIYATI + ” TEXT,”
      + ADSOY+” TEXT”+”)”;
      db.execSQL(CREATE_TABLE);
      }
      Bu sekilde değiştirdim.Hatan ise
      + KITAP_FIYATI + ” TEXT,” burda sondaki virgülü koymamıssın ve

      + ADSOY+” TEXT”+”)”; burdaki TEXT yazısını bosluksuz yazmıssın başında bir boşluk olacak

  • Yazınız için çok teşekkür ederim. Projenizi indirip kendime göre geliştirdim. Tabi hala eksiklerim var ama database yi listview de nasıl listelerim soruma cevap oldu.

    • Öncelikle bir önceki yorumunuz için teşekkür ederim. Mükkerrek kayıtı önlemenin yolu yeni kayıt eklerken insert etmeden önce bu isimli kitabı yada unique olarak neyi tutacaksanız select ile kayıt olup olmadını kontrol edebilirsiniz.”Select * From WHERE kitap_adi=’yeni_eklenecek_kitap_adi’ “; gibi bir select yapmak ve gelen sonucu saydırıp 0 dan büyükse insert etmeyip hata verdirebilirsiniz.

      • kitap adının mükerrerliğini aratmak çok saçma. VEri tabanı tamamaen farklı birşey yazılım yazmaya benzemez. Bir kere otomatik anahtar alan saçmalığı unutulmalı. aynı isimde farklı yazarların yazdığı kitap olabilir. Lütfen veri tabablarında anahtar alanı eğer sayısal ise kendiniz artırın. ISBN ise zaten sıkıntı olmaz

        • Burda amacımız veri tabanı mantığını anlatmak değil .Sqlite kullanım mantığını anlatmak.Kardeşimiz mükerrer kayıtları nasıl önleyebileceğini sormuş bende örnek vermişim ve dikkat ederseniz “unique olarak neyi tutacaksanız select ile kayıt olup olmadını kontrol edebilirsiniz” diye belirtmişim.Siz neden böyle bir yorum yapma gereği duydunuz onu anlamış değilim.Amacınız daha iyi bir çözümse burda verilen emeğe “saçmalık” demeniz bence hiç hoş değil. Bunun dışında veri tabanı ile ilgili sıkıntınız varsa iletişim bölümünden iletişime geçin ben size yardım ederim.

  • Son derece sade ve anlaşılır bir tutorial olmuş.Çok işime yaradı,elinize aklınıza sağlık.Teşekkürler.

  • Hazır bir sql veritabanımız varsa, o zaman nasıl olacak ? Yani veritabanımız uygulama içerisinde gömülü (embed) olacak? Bu durumda sizin bu kodlarınızı nasıl kullanabiliriz ?

  • Merhaba çok yararlı bir çalışma olmuş. Elinize sağlık. Ben kodları indirmeye çalıştım ancak zip dosyasının hasarlı olduğuna dair bir mesaj alıyorum. Kaynak kodları tekrar yüklemeniz mümkün mü acaba?

  • uygulama çok güzel çok faydalı oldu .kendi uygulamama uyarlamaya çalıştım ama durduruldu hatası alıyorum. ilk sayfada (mainactivity) onresume() metodunu /* */ şeklinde iptal ediyorum açılıyor. fakat onresume() metodunu açıyorum ve hata veriyo veritabanında hata olduğunu düşünüyorum. Alan isimlerini ve diğer değişkenleri değiştirmiştim eksiksiz.Yardım edermisiniz lütfen..Şimdiden teşekkür ederim.

    • düzeldi 🙂 database.class ‘da oncreate() metodunda hata yapmısım

      public void onCreate(SQLiteDatabase db) {

      String CREATE_TABLE = “CREATE TABLE ” + TABLE_NAME + “(”

      + KAYIT_ID + ” INTEGER PRIMARY KEY AUTOINCREMENT,”

      + KAYIT_ADI + ” TEXT,”

      + KAYIT_YAZI + ” TEXT”

      + “)”;

      db.execSQL(CREATE_TABLE);

      }

      burada ben + KAYIT_YAZI + ” TEXT,” son sutun olmasına ragmen virgul koymusum ve hepsı hatalı oluyo sıldım ve duzeldı 🙂 bu cozumude alttakı sorudan denedım ve duzeldı cok tesekkurlerr:))

  • tşk ederim güzel bir konu olmuş sizin dosyalarda sıkıntı yok denedim çalışıyor sıfırdan kendim yapayım dedim hata veriyor ilk açılışta listelemede sorun var anladığım kadarıyla tek tek inceledim hala hatayı bulamadım bire bir aynı kodlar sadece isimler farklı 🙂

    • kendi soruma yanıt vereyim 🙂 hatayı buldum

      adapter = new ArrayAdapter(this, R.layout.list_item,R.id.kategori_adi,kat_adlari);

      hatam şu şekildeydi list_item layout unu çağırıp anasayfa.xml sindeki edittext id sini çağırıyormuşum list_item içindeki id yi çağırsam hataya düşmeyekti 🙂

  • burada get rowcount() metodunu logın kısmında kullanıcagız yazmısın logın olma olayını anlatan 3-4 tane konu acılmıs acaba hangısı bu konuyla alakalıdır?
    public int getRowCount() {
    // Bu method bu uygulamada kullanılmıyor ama her zaman lazım olabilir.Tablodaki row sayısını geri döner.
    //Login uygulamasında kullanacağız
    String countQuery = “SELECT * FROM ” + TABLE_NAME;
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(countQuery, null);
    int rowCount = cursor.getCount();
    db.close();
    cursor.close();
    // return row count
    return rowCount;
    }

      • Ya kusura bakma cok rahatsız ettım sızı ama bısey sorabılırmıyım. Ben bu koda logın ekranını yapmak ıstedım.yenıbı verıtabanı olusturdum, logın sayfasından edıttext1 den kullanıcı adını, edıtttext2 den ıse sıfreyı cektmı ve buton1’e tıklandııgnda kontrol ıslemı yaptım ama olmadı kodu soyle kısaca gostereım buyuk bı mantık hatam avr ama bılmıyorum.

        <<BURADA EDİTTEXTLERDEN GELENLERI CEKTIM

        String ad,sifree,k_adi;

        ad=kadi.getText().toString();

        sifree=sifre1.getText().toString();

        <<BURADA ISE VERITANINDAKI ALANLARAL ESLESTIRDIM.

        Database db = new Database(getApplicationContext());

        kayit_liste = db.kayitlar();

        for(int i=0;i<kayit_liste.size();i++){

        k_adi=String.valueOf(kayit_liste.get(i).get("kullanici_adi")) ;

        if((ad.equals(k_adi)) )

        {

        Intent intent1=new Intent(Login.this,MainActivity.class);

        startActivity(intent1);

        }

        << eşitlik ıslemını bukadar basıt yolla yapmam hatalı sanırım. ama ben hıcbı onceden gırmısmı veya sıfre formata uygunmu felan bunları yapmak ıstemedım basıt bı uye ol ye gırıs yap yapmak ıstıyorumda.Sımdıden cok tesekkur ederım

          • Dediğiniz gibi çok karışmış . Sorununuzu anlayamadım. Login ekranı ile ilgili mi sorun? Eğer sorun ordaysa soruyu o dersin altından daha anlaşılır şekilde sorarsanız sevinirim.

          • şu sekılde ben logın olma ekranınada baktım fakat orda bılgılendırme oldugu ıcın cok ıslem kulalnılmıs mesela post gonderme veya maıl formatına uyumluluk gıbı.ben sadece kullanıcıdı ve sıfre ıle uye olacak sonrada logın sayfasından kullanıcıadı ve sıfreyle gırıs apıcak bunu ıstıyorum acama login.java daki oncreate() metodu ne olur bunu yapamadım. login.xml sayfasındaki edıttexlerı strınglere atadım, verıtabanındaki kullanıcı adı ve sıfre alanlarınıda bı strınge atadım ve ‘if’ kullanarak bunların bırbırıne esıtse maın.xml e gıt dedım ama olmadı. su sekılde.
            ad=kadi.getText().toString();

            Database db = new Database(getApplicationContext());

            kayit_liste = db.kayitlar();

            for(int i=0;i<kayit_liste.size();i++){

            k_adi=String.valueOf(kayit_liste.get(i).get("kullanici_adi")) ;

            if((ad.equals(k_adi)) )

            {

            Intent intent1=new Intent(Login.this,MainActivity.class);

            startActivity(intent1);

            }

          • tesekkurler cok basınızı agrıttım ama oldu verıtabanı ısmını yanlıs yazmısım tsekkurler 🙂

  • Taha bey kaynak kodlarınızı eclips te import ediyorum fakat açılmıyor java ve xml kodlarını göremiyorum
    “An error has occurred. See error log for more details.

    java.lang.NullPointerException”
    hataaı alıyorum yardımcı olabilir misiniz

  • sqlite ile galerideki bir resmi tutabılırmıyız acaba.Yolunuda tutsak olur veya resimleri eğer oluyosa bit seklindede tutabılırız ama bu mümkğnmğ acaba

  • Öncelikle çok teşekkür ederim ders için kendime göre düzenleyip kullandım. Benim sorum aynı kitabı kişi ikinci defa ekleyemesin bunu nasıl kontrol ederiz acaba.

    • Bu örnekte kitap adını unique kullanabilirsin.ama kitap adını unique kullanmak pekte mantıklı değil bunu baştan söleyim . Bu örnek için konuştuğumuzda unique tutulabilecek tek değer kitap adıdır. bunuda şöyle yaparsın yeni kitap eklendiği zaman database’e bir sorgu yollarsın. Bu sorgu aynı kitap adından var mı yok mu onu saydırırsın. Aynı kitap adı ile kayıt varsa uyarı verdirirsin kaydetmezsin.

  • kitap.put(KITAP_ADI, cursor.getString(0));

    kitap.put(KITAP_YAZARI, cursor.getString(1));

    kitap.put(KITAP_BASIM_YILI, cursor.getString(2));

    kitap.put(KITAP_FIYATI, cursor.getString(3));

    kitap.put(OGRENCI_TEL, cursor.getString(4));
    öğrenci tel ekleynce problem çıkıyor.

  • public void onCreate(SQLiteDatabase db)

    {

    db.execSQL(“CREATE TABLE ” + TABLE_NAME + “( KITAP_ID INTEGER PRIMARY KEY AUTOINCREMENT , KITAP_ADI TEXT NULL, KITAP_YAZARI TEXT NULL, KITAP_BASIM_YILI TEXT NULL, KITAP_FIYATI TEXT NULL, OGRENCI_TEL TEXT NULL, DANISMANI TEXT NULL, GRUBU TEXT NULL )”);

    }

    • Peki uygulama çalısıırken bir hata veriyor mu.? Sütunları olusturdugun yeri paylasırmısın? yani benim kaynak kod için söylüyorum String CREATE_TABLE ‘ ı paylasırsan hata var mı inceleriz.

      • db.execSQL(“CREATE TABLE ” + TABLE_NAME + “( KITAP_ID INTEGER PRIMARY KEY AUTOINCREMENT , KITAP_ADI TEXT NULL, KITAP_YAZARI TEXT NULL, KITAP_BASIM_YILI TEXT NULL, KITAP_FIYATI TEXT NULL, OGRENCI_TEL TEXT NULL, DANISMANI TEXT NULL, GRUBU TEXT NULL )”);

  • sizin yaptığınız database yeni sütünlar eklediğim ama database yeni eklediğim sütünleri görmüyor yardımcı olursanız çok memnun olurum.

  • SQL Sorgu cümlem doğrumu?

    String selectQuery = “SELECT * FROM ” + TABLE_NAME + ” WHERE BILDIRIM_DURUM=’0′ ORDER BY id DESC Limit 1″;

      • Eğer bu sorguyu çalıştırırsam, program durduruldu hatası veriyor. Yani eğer kayıt gelmiyorsa program sürekli durduruldu hatası mı verecek?
        Ayrıca linkini attığınız konuyu dün inceledim. 2. Resimde 3. tıkladığınız yere ben tıkladığı zaman hiç bir şey listelenmiyor(Klasör içeriği). Bu telefonun root olmamasından mı kaynaklanıyor acaba?
        Teşekkür ederim, dönüş bekliyorum.

        • Dönen hata kayıt gelmediğinden kaynaklı olduğuna emin misin? Burdaki örnek uygulamamızda kayıt yoksa hata vermiyor. O önlemleri sen alıcaksın. Database dolumu boş mu bakacaksın. Ondan sonra işlem yapıcaksın ki patlamasın. Hiç olmadı try catch içinde yapacaksın boş gelirse patlamıcak.
          ikinci sorunda ise ya cihazın rootlu olacak yada direk emülatör üzerinde geliştirme yaparak o directorye ulaşabilirsin.

  • Hayırlı sabahlar. Hocam projenizi biraz uyarlamaya çalıştım kendime göre fakat main activity class ında onOptionsItemSelected bölümünde case R.id.ekle de ekle hep kırmızı yanıyor böyle bir değişken yok ortada. Bu ekle id si sanırım actionbar daki uygulama ilk açıldığında görünen buton. Bu butonu nasıl yapabilirim? Şimdiden teş.ler

  • Merhaba öncelikle ben de böyle bir örneği bizlere hem de yorumlayarak verdiğiniz için teşekkür ederim. Kodlarınızı inceleyerek kah yazarak kah kopyala yapıştır ile eclipse de uyguladım. Tüm hataları bulup tek tek giderdim ve programı da çalıştırdım. Ancak belki komik gelecek “”Henüz Kitap Eklenmemiş.n Yukarıdaki + Butonundan Ekleyiniz” TOAST’ını da gördüm. Yalnız + butonu yok ortada. NErede bu + butonu diye çok aradım ama bulamadım. Yukardaki Action Bar da (Altüste üç nokta) tıklayınca yalnız Setting geliyor. Lütfen nerede bu + butonu ? 😀

    • Merhabalar ,
      Bizim uygulamamızı direk indirip denediğinizde + butonunu göreceksiniz. Ben şimdi tekrar indirdim acaba sorun mu var diye test ettim ve ekran görüntüsü aldım. Sağ üstte tarafta + butonu mevcuttur.

  • bir rehber uygulaması yaptım. Ancak veri çok olunca ulaşmak zor oluyor listview deki verileri alfabetik olarak aramayı nasıl yapabiliriz. yada editex le aratmayı .. kolay gelsin iyi çalışmalar

  • bir rehber uygulaması yaptım. Ancak veri çok olunca ulaşmak zor oluyor listview deki verileri alfabetik olarak aramayı nasıl yapabiliriz. yada editex le aratmayı .. kolay gelsin iyi çalışmalar

  • Merhaba. Benim derdim İLİŞKİSEL VERİTABANI ile. En azından 3 tabloyu birbirine NASIL
    bağlayabilirim? Bu konuda örnek verebilir misiniz?
    Kolay gelsin.

  • Merhaba herşeyi birebir yapmama rağmen uygulamayı çalıştırınca “unfortunately sqlite has stopped” uyarısı alıyorum sebebi ne olabilir acaba?

      • Cevap için teşekkür ederim. Ancak zaten Custom Listview yaptıktan sonra BadgeView kullanmanın bir anlamı kalmıyor. Keşke “simple adapter” a eklenebilseydi. Teşekkürler.

    • Anladığım kadarıyla aşağıdaki kod parçasından bahsediyorsunuz…

      Database db = new Database(getApplicationContext()); // Db bağlantısı oluşturuyoruz. İlk seferde database oluşturulur.
      kitap_liste = db.kitaplar();//kitap listesini alıyoruz
      if(kitap_liste.size()==0){//kitap listesi boşsa
      Toast.makeText(getApplicationContext(), "Henüz Kitap Eklenmemiş.\nYukarıdaki + Butonundan Ekleyiniz", Toast.LENGTH_LONG).show();
      }else{
      kitap_adlari = new String[kitap_liste.size()]; // kitap adlarını tutucamız string arrayi olusturduk.
      kitap_idler = new int[kitap_liste.size()]; // kitap id lerini tutucamız string arrayi olusturduk.
      for(int i=0;i

    • Database db = new Database(getApplicationContext()); // Db bağlantısı oluşturuyoruz. İlk seferde database oluşturulur.
      kitap_liste = db.kitaplar();

      Yukarıda Database Db = new Database(getApplicationContext()); ile Database objesi oluşturuyor ve oluşan Database objesine ait methodları kullanabiliyoruz.

  • Hazır veritabanından listviewe veri çekmek istiyorum.bunun için de örneğin id=1 olan verilerin hepsi altalta listviewde görüntülensin istiyorum ama sadece ilk veriyi alıyor. diğer id=1 olan veriler listviewde görüntülenmiyor.Kullanığım kod aşağıdaki gibi.Yardımcı olursanız çok sevinirim.Teşekkürler.

    public HashMap kelimeDetay(int id) {
    HashMap kelime = new HashMap();
    String selectQuery = “SELECT * FROM Veri WHERE id=”+id;

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);
    cursor.moveToFirst();

    kelime.put(TURKCENAME, cursor.getString(6));
    cursor.moveToNext();

    cursor.close();
    db.close();

    return kelime;

    }

      • public HashMap kelimeDetay(int id) {

        HashMap kelime = new HashMap();
        String selectQuery = “SELECT * FROM Quran WHERE surah_id=”+id;

        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);

        cursor.moveToFirst();

        kelime.put(TURKCENAME, cursor.getString(6));
        cursor.moveToNext();

        cursor.close();
        db.close();

        return kelime;

        }

        Kod,veritabanı ve ekran çıktısı bu şekilde Ben örneğin surah_id kısmı 1 olan verilerin hepsini ekrana yazdırmak istiyorum ancak sadece ilk kayıt geliyor.

  • Taha Hocam öncelikle ders için teşekkür ederim, çok işime yaradı. Projeyi indirdim Android Studio ya entegre ettim ve çalıştırdım burada hiç bir sorun yok. Sormak istediğim proje içerisinde oluşturduğumuz veritabanına fiziksel olarakta ulaşabilir miyiz? Ulaşabilirsek nerende ulaşabiliriz? Ben biraz aradım fakat bulamadım, yardımcı olursanız sevinirim.

    • Eren Hocam yorum için teşekkürler.
      Andorid Studio -> Tools -> Android -> Android Device Monitor -> File Explorer tabı
      Alttaki listelenen klasörlerden data->senin uygulama paket adı->databases
      Databaseini seçtikten sonra sol üstteki save disk ile kaydedebilirsin bilgisayarına.

      ÖNEMLİ NOT: Bunu sadece androidin kendi emülatöründe veya rootlanmış cihazlarda yapabilrisin.

      • Buldum hocam, ben hep bi dosya yolunda aradığım için yanılmışım. Teşekkür ederim.

  • Merhabalar
    Bu uygulamanıza benzer bir ödevim var. Ekle Sil Güncelle vb. veritabanıyla alakalı işlemler yapılacak. Benim yapacağım uygulama localde değilde serverda çalışacak. Galiba web servise ile de bağlantılı olması gerekiyormuş. Bu konu hakkında hiçbir bilgim yok şuan. Ne yapmalıyım?Nerden başlamadıyım? Özellikle web serviceler ve server ile alakalı fazla bir bilgim yok. Hangi adımları takip etmeliyim? Yardımcı olursanız çok sevinirim. İyi çalışmalar diliyorum. Kolay gelsin.

  • 2 table olsa nasıl yapardık bunu? onCreate içine yazsak aynı şekilde olur mu? çakışma olabilir bu durumda özel bi fonksiyon içinde 2. tableyi yazabilir miyim?

  • kendi projeme eklemek istedim boyle bir hata ile karsılastım

    @Override
    public void onCreate(SQLiteDatabase db) {
    String CREATE_TABLE = “CREATE TABLE ” + TABLE_NAME + “(”
    + ID + ” INTEGER PRIMARY KEY AUTOINCREMENT,”
    + ODEME_TURU + ” TEXT,”
    + MIKTAR + ” TEXT,”
    + NOT + ” TEXT,”
    + TARİH + ” TEXT” + “)”;
    db.execSQL(CREATE_TABLE);

    }

    java.lang.RuntimeException: Unable to resume activity {com.gider.gelir.gelirgider/com.gider.gelir.gelirgider.MainActivity}: android.database.sqlite.SQLiteException: near “not”: syntax error (code 1): , while compiling: CREATE TABLE islemler_listesi(id INTEGER PRIMARY KEY AUTOINCREMENT,islem_tur TEXT,para TEXT,not TEXT,tarih TEXT)
    12-15 22:06:19.541 13451-13451/com.gider.gelir.gelirgider E/AndroidRuntime: #################################################################
    12-15 22:06:19.541 13451-13451/com.gider.gelir.gelirgider E/AndroidRuntime: Error Code : 1 (SQLITE_ERROR)
    12-15 22:06:19.541 13451-13451/com.gider.gelir.gelirgider E/AndroidRuntime: Caused By : SQL(query) error or missing database.
    12-15 22:06:19.541 13451-13451/com.gider.gelir.gelirgider E/AndroidRuntime: (near “not”: syntax error (code 1): , while compiling: CREATE TABLE islemler_listesi(id INTEGER PRIMARY KEY AUTOINCREMENT,islem_tur TEXT,para TEXT,not TEXT,tarih TEXT))
    12-15 22:06:19.541 13451-13451/com.gider.gelir.gelirgider E/AndroidRuntime: #################################################################
    12-15 22:06:19.541 13451-13451/com.gider.gelir.gelirgider E/AndroidRuntime: at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4155)
    12-15 22:06:19.541 13451-13451/com.gider.gelir.gelirgider E/AndroidRuntime: at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4246)
    12-15 22:06:19.541 13451-13451/com.gider.gelir.gelirgider E/AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3360)
    12-15 22:06:19.541 13451-13451/com.gider.gelir.gelirgider E/AndroidRuntime: at android.app.ActivityThread.access$1100(ActivityThread.java:221)
    12-15 22:06:19.541 13451-13451/com.gider.gelir.gelirgider E/AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
    12-15 22:06:19.541 13451-13451/com.gider.gelir.gelirgider E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:102)
    12-15 22:06:19.541 13451-13451/com.gider.gelir.gelirgider E/AndroidRuntime: at android.os.Looper.loop(Looper.java:158)
    12-15 22:06:19.541 13451-13451/com.gider.gelir.gelirgider E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:7225)
    12-15 22:06:19.541 13451-13451/com.gider.gelir.gelirgider E/AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
    12-15 22:06:19.541 13451-13451/com.gider.gelir.gelirgider E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
    12-15 22:06:19.541 13451-13451/com.gider.gelir.gelirgider E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
    12-15 22:06:19.541 13451-13451/com.gider.gelir.gelirgider E/AndroidRuntime: Caused by: android.database.sqlite.SQLiteException: near “not”: syntax error (code 1): , while compiling: CREATE TABLE islemler_listesi(id INTEGER PRIMARY KEY AUTOINCREMENT,islem_tur TEXT,para TEXT,not TEXT,tarih TEXT)
    12-15 22:06:19.541 13451-13451/com.gider.gelir.gelirgider E/AndroidRuntime: #################################################################
    12-15 22:06:19.541 13451-13451/com.gider.gelir.gelirgider E/AndroidRuntime: Error Code : 1 (SQLITE_ERROR)

    • TARİH yazmışsın ya onu böyle yap hata Düzelir +TARIH + ” TEXT” + “)”;

  • Merhabalar öncelikle yaptığınız çalışmadan dolayı teşekkür ederim. Sqlite konusunda gayet açık ve anlaşılır Türkçe kaynak olması büyük bir avantaj, bir sorum olacak size yaptığım uygulama da listeleme yöntemini sizin programdaki gibi yaptım farklı olarak listview de bir ikinci alanın daha görünmesini istedim lakin bir türlü başaramadım select sorgu cümlesini değiştirdim lakin durduruldu hatası aldım.

  • Merhabalar. Öncelikle konu anlatımı ve uygulama için teşekkür ederim. Merak ettiğim bir soru var? Android Studio üzerinde yaptığımız SQLite tabloları nereye kayıt ediliyor yani ben bu tablolara nasıl ulaşabilirim??

      • BİR ÖNEMLİ NOT DAHA: EMULATOR API LEVEL 24 VE UZERINDE FILE EXPLORER DOSYALARI GOSTERMIYOR. API LEVEL 23 TE GOZUKUYOR. hocam ben database imi masaüstüne kaydettim we sqlite browser ile açıyorum fakat hep boş gözüküyor. nedeni nedir ?

  • Ellerinize sağlık. Her dersiniz gibi bu da harika. Sadece buradaki dersleri birleştirerek çok güzel şeyler ortaya çıkarmak mümkün. Sayenizde çok şey öğrendim 🙂

  • merhabalar hocam,
    “data/data/” klasöründeki apklara ait databaseleri açıp, veri eklemek istiyorum.
    bunu nasıl yapabiliriz?

  • Merhaba birden fazla Class ve xml dosyası oluşturmadan veri tabanındaki bilgileri tek class’ta gösterebilirmiyiz?
    Daha açıklayıcı olması için örnek vereyim
    Örnegin veri tabanında 5 soru var ve 5 tane cevap var . ilk sorunun yanıtına baktıktan sonra ikinci soruya aynı class(sayfadan )tan devam edebilirmiyiz?

  • Gördüğüm en kötü örnek diyebilirim.. nerede ekliyor nerede siliyor kim uçuyor kim kaçıyor hiçbirşey belli değil. MainActivity.class Türkiyedeki diziler gibi.. kimin eli kimin cebinde çözemedim. Neyse yine de emek vermişsin.

  • Anlatımlarınızdan hep yaralanıyorum teşekkür ederim başarılarınızın devamını dilerim ancak benim bir problemim var lütfen yardımcı olur musun?

    //Veritabanı Classı
    /**
    * Created by burak on 7.08.2017.
    */

    public class VeriTabani extends SQLiteOpenHelper {

    private static final int DATABASE_VERSION = 1;

    // Database Name
    private static final String DATABASE_NAME = “sqlite_database”;//database ad�

    private static final String TABLE_NAME = “register”;
    private static String USER_NAME = “user_name”;
    private static String USER_ID = “id”;
    private static String USER_PASSWORD = “user_password”;
    public VeriTabani(Context context)
    {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
    String CREATE_TABLE = “CREATE TABLE ” + TABLE_NAME + “(”
    + USER_ID + ” INTEGER PRIMARY KEY AUTOINCREMENT,”
    + USER_NAME + ” TEXT,”
    + USER_PASSWORD + ” TEXT,”
    + “)”;
    db.execSQL(CREATE_TABLE);
    }

    public void Ekle(String user_name, String user_password) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(USER_NAME, user_name);
    values.put(USER_PASSWORD, user_password);

    db.insert(TABLE_NAME, null, values);
    db.close(); //Database Ba�lant�s�n� kapatt�k*/
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }
    }

    //Register.activity
    package com.brkbzdg.database;

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

    public class Register extends AppCompatActivity {

    EditText USER_NAME,USER_PASSWORD;
    Button REG;
    Context ctx=this;

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

    USER_NAME= (EditText) findViewById(R.id.reg_username);
    USER_PASSWORD= (EditText) findViewById(R.id.reg_password);
    REG= (Button) findViewById(R.id.register);
    REG.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
    String user_name,user_password;
    user_name=USER_NAME.getText().toString();
    user_password=USER_PASSWORD.getText().toString();

    if(user_name.matches(“”) || user_password.matches(“”) ){
    Toast.makeText(getApplicationContext(), “Tüm Bilgileri Eksiksiz Doldurdunuz!”, Toast.LENGTH_LONG).show();
    }else{
    VeriTabani db = new VeriTabani(getApplicationContext());
    db.Ekle(user_name,user_password);
    db.close();
    Toast.makeText(getApplicationContext(), “Kaydınız Başarıyla Eklendi.”, Toast.LENGTH_LONG).show();
    USER_NAME.setText(“”);
    USER_PASSWORD.setText(“”);
    }
    }
    });

    }
    }

    Bu kodları çalıştırdığımda emulatorde açılıyor ancak butona bastığımda unfortunately, Database has stoped diyor.
    Teşekkürler…

  • polyline tipindeki değişkneleri bu tablolarda nasıl tutabilirim. Mesela bir otobüs hattının roatasını tutmak ve onu ekrana yazdırmak istiyorum bu sqlite kullanarak android studioda mümkün müdür?

  • Merhaba hocam, ben bir login uygulaması yapıyorum SQLitedatabase’te veritabanında. Kullanıcıları veritabanına kaydettirdikten sonra kayıt ettiğim kullanıcı adı ve şifresiyle login yapıyorum. Sorum şu, login yaptıktan sonra girilen Activity’de login yapan kişinin adıvesoyadı bölümünü Hoşgeldiniz …….. şeklinde çekmek istiyorum. Kodum şöyle;

    public String KullaniciAdiAl() throws SQLException {
    String kuladsoyad = “”;
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cur = db.query(TABLO_ADI, new String[]{KEY_ADIVESOYADI}, null, null, null, null, null);
    if(cur.moveToLast()) {
    do {
    kuladsoyad = cur.getString(0);
    } while (cur.moveToNext());
    }
    cur.close();
    return kuladsoyad;
    }

    MainActivity’deki kodum:

    tvKullaniciAdiAl = (TextView) findViewById(R.id.tvKullaniciAdiAl);
    Databasem db = new Databasem(getApplicationContext());
    tvKullaniciAdiAl.setText(“Hoşgeldin:\n”+vy.KullaniciAdiAl());

    Bu kod çalışıyor fakat farklı isimlerle giriş yapmama rağmen sürekli veritabanımdaki sabit bir kişinin adsoyad bilgisini karşıma getiriyor. Acaba nerede hata yaptım? Yardımcı olabilir misiniz? Teşekkürler şimdiden.

  • Öğrenmeye çalışıyorum ve Türkçe kaynak olarak sadece sizde faydalı ve anlaşılır bilgiler bulabiliyorum. Emeğinize sağlık çok teşekkürler.

  • Merhabalar. Öncelikle anlatımınız için teşekkürler. Kodu birerbir aynı şekilde kullanarak projeme ekledim ama “no such table” hatası alıyorum. Veri eklemek istediğimde böyle bir tablo yok diye hata döndürüyor. Yardımcı olursanız sevinirim.

  • UI library kütüphanesini değiştirdim android support library kütüphanesine çevirdim actionbar üzerindeki menü ekleme butonunu custom PNG uzantılı farklı bir icon ile değiştim bar üzerindeki siyah renk arayüzünü mavi yaptım sdk versiyonunu değiştim telefon ide üzerinde manuel değiştim 1 saatimi aldı ama değdi isteyen olursa zip dosyasını atabilirim. ?? [email protected]