Uygulamanın resimleri:
Bir tane Veritabani adında sınıf oluşturalım. İçerisini aşağıdaki gibi düzenleyelim.
/*SQLiteOpenHelper'dan kalıtalım.*/ public class Veritabani extends SQLiteOpenHelper { /*Veritabanı için ad, tablo adı, versiyon ve sütun için değişken oluşturalım.*/ private static final String DB_NAME="Veritabani"; private static final int DB_VER = 1; public static final String DB_TABLE = "Gorev"; public static final String DB_SUTUN = "GorevIsmi"; public Veritabani(Context context) { /*Yukarıda tanımlanan değişkenleri kullanalım*/ super(context, DB_NAME, null, DB_VER); } @Override public void onCreate(SQLiteDatabase db) { /*Tablo oluşturmak için sorgumuzu yazalım. %s olan yerlere virgülden sonra yazılan değişkenlerin geleceği belirtiliyor.*/ String sorgu = String.format("CREATE TABLE %s (ID INTEGER PRIMARY KEY AUTOINCREMENT,%s TEXT NOT NULL);", DB_TABLE, DB_SUTUN); /*SQL kodu çalıştırılıyor.*/ db.execSQL(sorgu); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { /*Veritabanında oluşan her değişiklik için veritabanında kayıtlı olan tabloyu silip yerine yenisini oluşturarak güncelleme işlemini yapıyor.*/ String sorgu = String.format("DELETE TABLE IF EXISTS %s", DB_TABLE); /*Yazılan sorguyu uyguluyor.*/ db.execSQL(sorgu); /*onCreate'e göndererek tabloyu oluşturuyor.*/ onCreate(db); } public void yeniGorevEkle(String gorev){ /*getWritableDatabase ile yazılabilir/okunabilir bağlantı oluşturuluyor.*/ SQLiteDatabase db = this.getWritableDatabase(); /*Veritabanı işlemleri için ContentValues oluşturuluyor.*/ ContentValues values = new ContentValues(); /*MainActivity'den gelen gorev değerini alarak veritabanına kaydediyoruz.*/ values.put(DB_SUTUN, gorev); /*Veritabanına satır eklemek için kullanılan kod.*/ db.insertWithOnConflict(DB_TABLE,null, values, SQLiteDatabase.CONFLICT_REPLACE); /*Veritabanı bağlantısı kapatılıyor.*/ db.close(); } public void gorevSil(String gorev){ /*getWritableDatabase ile yazılabilir/okunabilir veritabanı bağlantısı oluşturuluyor.*/ SQLiteDatabase db = this.getWritableDatabase(); /*MainActivity'den gelen gorev değerini silmek için aşağıdaki sorgu yazılıyor.*/ db.delete(DB_TABLE,DB_SUTUN + " = ?", new String[]{gorev}); /*Veritabanı bağlantısı kapatılıyor.*/ db.close(); } /*Veritabanına kaydedilen tüm verileri çağırmak için aşağıdaki metot kullanılıyor. Tüm verileri ArrayList içine kaydediyor.*/ public ArrayList<String> tumGorevleriGetir(){ /*Bir tane ArrayList listesi oluşturuluyor.*/ ArrayList<String> gorevListesi = new ArrayList<>(); /*getReadableDatabase ile sadece okunabilir bir veritabanı bağlantısı oluşturuluyor.*/ SQLiteDatabase db = this.getReadableDatabase(); /*Cursor ile sorgumuzu yapıyoruz. Tablonun içindeki tüm sütunları cursor'a aktarıyoruz.*/ Cursor cursor = db.query(DB_TABLE, new String[]{DB_SUTUN},null,null,null,null,null); /*Sonraki kayıt olmayana kadar dönmeye devam ediyor.*/ while(cursor.moveToNext()){ /*Her sütunun sırasını alıyor...*/ int index = cursor.getColumnIndex(DB_SUTUN); /*...gorevListesi listesine aktarıyor.*/ gorevListesi.add(cursor.getString(index)); } /*cursor ve veritabanı kapatılıyor. gorevListesi döndürülüyor.*/ cursor.close(); db.close(); return gorevListesi; } }
Tasarım ayarlarından kaçınarak sade halde activity_main.xml dosyasını atıyorum.
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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=".MainActivity"> <ListView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/gorevListView"/> </RelativeLayout>
row.xml ile eklenen görevler için bir tane TextView ve silmek içinde bir tane Button tanımlaması yapılıyor. Layout klasörü altına tanımlayalım.
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/gorev_basligi" android:text="Örnek" android:textSize="20sp" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:id="@+id/btnDelete" android:text="SİL" android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="gorevSil" /> </RelativeLayout>
Menüde bulunan + işareti için bir tane daha xml oluşturacağız. Bunun için res klasörüne sağ tık ile new -> Android Resource File seçin. File Name kısmını menu, Resource Type kısmını Menu seçin ve ok diyerek işlemi bitirin.
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" > <item android:id="@+id/yeni_gorev_ekle" android:icon="@android:drawable/ic_menu_add" android:title="Yeni Görev Ekle" app:showAsAction="always" /> </menu>
Icon kısmında var olan bir simge kullanıyoruz. showAsAction ile actionBar üstünde sürekli gözükmesini sağlıyoruz. MainActivity.java sınıfını açıklamaları ile birlikte aşağıya bırakıyorum.
public class MainActivity extends AppCompatActivity { /*Veritabani nesnesi, adapter ve listView tanımlayalım.*/ Veritabani veritabani; ArrayAdapter<String> mAdapter; ListView gorevListesi; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /*Veritabani nesnesi oluşturalım.*/ veritabani = new Veritabani(this); /*Görevlerin yazılacağı listView bağlantısını yapalım. gorevListView, activity_main.xml'de tanımlanmıştı.*/ gorevListesi = (ListView) findViewById(R.id.gorevListView); /*Tüm görevleri getirmesi için kullanacağımız metot.*/ tumGorevleriGetir(); } private void tumGorevleriGetir() { /*Veritabanı sınıfında yazılan tumGorevleriGetir metodundan kayıtların hepsini listeye aktardık.*/ ArrayList<String> gorevArrayListesi = veritabani.tumGorevleriGetir(); /*Adapter null olana kadar sorgu çalışıyor.*/ if (mAdapter == null){ mAdapter = new ArrayAdapter<String>(this, R.layout.row, R.id.gorev_basligi, gorevArrayListesi); gorevListesi.setAdapter(mAdapter); } else{ mAdapter.clear(); mAdapter.addAll(gorevArrayListesi); mAdapter.notifyDataSetChanged(); } } /*menu.xml'li tanımlamak için onCreateOptionMenu'yü Override edelim.*/ @Override public boolean onCreateOptionsMenu(Menu menu) { /*xml'i bağlayalım.*/ getMenuInflater().inflate(R.menu.menu,menu); /*İkon rengini beyaz yapalım. return hariç alttaki kodları yapmasanızda olur.*/ Drawable icon = menu.getItem(0).getIcon(); icon.mutate(); icon.setColorFilter(getResources().getColor(android.R.color.white), PorterDuff.Mode.SRC_IN); return super.onCreateOptionsMenu(menu); } /*Menüden seçilen elemanlar için yapılacak işlemleri onOptionsItemSelected içerisinde belirtiyoruz. Yani ekranda + tuşuna basınca yapılacakları belirteceğiz.*/ @Override public boolean onOptionsItemSelected(MenuItem item) { /*Menüde tıklanan itemin id değerini alıyor.*/ switch (item.getItemId()){ /*Alınan id değeri yeni_gorev_ekle ise alttaki işlemleri yapacak.*/ case R.id.yeni_gorev_ekle: /*Yeni bir tane EditText oluşturuyor.*/ final EditText gorevEditText = new EditText(this); /*Dialog ekranı oluşturuluyor.*/ AlertDialog dialog = new AlertDialog.Builder(this) /*Dialog ekranının başlığı:*/ .setTitle("Yeni Görev Ekle") /*Dialog ekranının mesajı*/ .setMessage("Ne yapmak istiyorsun?") /*Dialog ekranında yukarıda oluşturulan EditText'i gösteriyoruz.*/ .setView(gorevEditText) /*Olumlu cevap butonuna basılırsa (yani sağ taraftakine) yapılacak işlemler tanımlanıyor.*/ .setPositiveButton("Ekle", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { /*EditText'ten alınan değeri gorev değişkenine aktarıyoruz.*/ String gorev = String.valueOf(gorevEditText.getText()); /*veritabanında oluşturduğumuz yeniGorevEkle metoduna bu değeri gönderim ekleme işlemini yapıyoruz.*/ veritabani.yeniGorevEkle(gorev); /*Her görev eklendiğinde ekrandaki görevler otomatik yenilensin diye tumGorevleriGetir metodunu tekrar tanımlıyoruz.*/ tumGorevleriGetir(); } }) /*Olumsuz butona yani soldakine basılırsa ekranı kapatıyor.*/ .setNegativeButton("Vazgeç",null) .create(); /*Dialog ekranını gösteriyoruz.*/ dialog.show(); return true; } return super.onOptionsItemSelected(item); } /*Sil butonuna basılınca yapılacak olan işlemleri yapıyoruz.*/ public void gorevSil(View view){ View parent = (View)view.getParent(); TextView gorevEditText = (TextView)parent.findViewById(R.id.gorev_basligi); String gorev = String.valueOf(gorevEditText.getText()); veritabani.gorevSil(gorev); tumGorevleriGetir(); } }
Projenin kaynak kodları aşağıda: