KOTLİN ÇEVRİMDIŞI KAYIT OLMA UYGULAMASI (OFFLİNE REGİSTER APP) – Ders 8

KOTLİN ÇEVRİMDIŞI KAYIT OLMA UYGULAMASI (OFFLİNE REGİSTER APP) – Ders 8

Şimdi edindiğimiz bilgilerle bir kayıt işlemi yapalım. Kişiden isim, soyisim, yaş, email ve şifre değerlerini aldığımız bir yapı oluşturalım. Bunun için öncelikle layout’unu oluşturmamız lazım.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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">


    <EditText
        android:id="@+id/emailText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="36dp"
        android:layout_marginTop="32dp"
        android:layout_marginEnd="36dp"
        android:ems="10"
        android:hint="Email"
        android:inputType="textPersonName"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/ageText" />

    <EditText
        android:id="@+id/passwordText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="36dp"
        android:layout_marginTop="32dp"
        android:layout_marginEnd="36dp"
        android:ems="10"
        android:hint="Şifre"
        android:inputType="textPersonName|textPassword"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/emailText" />

    <EditText
        android:id="@+id/ageText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="36dp"
        android:layout_marginTop="32dp"
        android:layout_marginEnd="36dp"
        android:ems="10"
        android:hint="Yaşınız"
        android:inputType="number|textPersonName"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/surnameText" />

    <EditText
        android:id="@+id/surnameText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="36dp"
        android:layout_marginTop="32dp"
        android:layout_marginEnd="36dp"
        android:ems="10"
        android:hint="Soyisminiz"
        android:inputType="textPersonName"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/nameText" />

    <EditText
        android:id="@+id/nameText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="36dp"
        android:layout_marginTop="32dp"
        android:layout_marginEnd="36dp"
        android:ems="10"
        android:hint="İsminiz"
        android:inputType="textPersonName"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/saveButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        android:layout_marginEnd="48dp"
        android:text="KAYIT OL"
        android:onClick="makePerson"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/passwordText" />
</androidx.constraintlayout.widget.ConstraintLayout>

EditText’ler ve buton ile yapımızı oluşturduk. Button için bir onClick methodu oluşturduk ve makePerson() ismini verdik.

    fun makePerson(view : View) {
        val name = nameText.text.toString()
        val surname = surnameText.text.toString()
        val age : Int? = ageText.text.toString().toIntOrNull()  //kişi burada yazı girebilir. Aslında ageText’i xml dosyasında tanımlarken number tipinde de tanımlayabilirdik. Veya bu yöntemi kullanarak kotlin dosyasında da güvenliğini sağlayabiliriz.
        val email = emailText.text.toString()
        val password = passwordText.text.toString()
        if (name.equals("") || surname.equals("") || age == null || email.equals("") || password.equals("")){
            Toast.makeText (applicationContext, "Tüm alanları doldurmalısın" , Toast.LENGTH_SHORT).show()
        }else
        {
            Toast.makeText (applicationContext, "İsim : $name Soyad : $surname Yaş : $age Email : $email Şifre : $password" , Toast.LENGTH_LONG).show()
        }

    }

Bu şekilde button’a tıklandığında ekrana toast mesajı gösteren bir uygulama yapmış olduk. Eğer buraya kadar hatasız yaptıysak devam edebiliriz.

Şimdi hem bu uygulamaya devam ederken hem de örneksiz çok anlatılamayacak scope ve sharedpreferences konularını bu uygulama ile işleyelim.

Scope

Scope java’da kotlin’de veya başka bir dilde hep benzer şekilde çalışır. İki scope arasındaki kodlara, değişkenlere başka scope içinden doğrudan erişilemez.

Alt scope’ta ise erişilibilir

{
/*
Kod, Değişkenler… 
*/
{
/*
ALT SCOPE
Erişim var 
*/
}
}
{
/*
FARKLI SCOPE
Erişim yok
*/
}

Kotlin Lateinit

Önceki derste de kullanmıştım. Lateinit bir değişkeni şimdi tanımlıyorum değer atamasını sonra yapacağım demek oluyor. Yani mesela

Var myString : String = “”

yapmak yerine

lateinit var myString : String

İkisinin farkı ortada aslında. Yukarıdaki boşlukta olsa bir string değer atıyorsun. Hafızada o boşluk değerini string halde tutuyor. Alttaki laneinit ile kullanılan örnekte bunu daha sonradan tanımlayacağını söylüyorsun. Bu dışarıdan bir bilgi olabilir , veritabınından alınacak bir bilgi olabilir veya herhangi bir değişken veya sabit olabilir ama bunu sonradan tanımlayacağını şimdi initialize etmeyeceğini belirtiyorsun. Lateinit kotlini javadan ayıran ve güvenli kod yazılmasını sağlayan en önemli yapılardan biridir.

Kotlin Veri Kaydetmek, Silmek ve Getirmek (SharedPreferences)

Yukarıdaki çevrimdışı kayıt örneğinde tamam verileri aldık ve ekrana Toast mesajı olarak bastırdık. Ama uygulamadan çıkıp tekrar girdiğimizde bu veriler bir yerde gösterilmiyor veya bir yere kaydedilmedi aslında. Bu tarz uygulamalarda kullanıcı bilgilerini tuttuğumuz bir yapı olan sharedPreferences’e gelin yakından bakalım

Verileri Saklamak (SharedPreferences)

SharedPreferences aslında bir sınıf. Sınıf olduğu içinde öncelikle sharedPref objesi oluşturmamız lazım.

private lateinit var sharedPref : SharedPreferences // MainActivity altında
sharedPref = this.getSharedPreferences("com.axisting.offlineregisterapp", Context.MODE_PRIVATE) // onCreate altında

NOT : Burada MODE_PRIVATE ile bu uygulamada sharedPref ile kaydedilecek verilere sadece bu uygulamadan erişileceğini söylüyoruz. Erişimini kısıtlıyoruz. Kısıtlamadığımız durumda ise aynı cihazdan diğer uygulamalardan dahi erişilebilir veriler ekleyebiliriz. Şuan için bunu istemiyoruz.

Nesneyi oluşturduk. Artık cihazda “com.axisting.offlineregisterapp” altında bu bilgiler saklanabilir hale geldi.(Uygulama ismiyle kayıt etmek kodun okunurluğunu çoğu zaman için artırır.)

Şimdi örneğimiz doğrultusunda buttona tıklanıldığında gelişecek aksiyonlar içerisine bunları sharedpref içinde kayıt edelim.

            sharedPref.edit().putString ("name", name).apply()
            sharedPref.edit().putString("surname", surname).apply()
            sharedPref.edit().putInt("age", age).apply()
            sharedPref.edit().putString("email", email).apply()
            sharedPref.edit().putString("password", password).apply()

Şekildeki gibi önce anahtar değer sonrasında ise kayıt edilecek girdi değeri ekliyoruz. Yani cihaz hafızasında örnek verecek olursak şu şekilde kayıt oluyor

Name : volkan

Surname : demir

Age : 26

Email : info@axisting.com

Password : 123456

Verileri Okumak, Verileri Getirmek (SharedPreferences)

Verileri istediğimiz zaman okuyabiliriz artık. Bunun için uygulamanın her yerinden erişmek adına sharedPreferencesi önce global tanımlayalım

private lateinit var sharedPref : SharedPreferences // mainactivity altı
sharedPref = this.getSharedPreferences("com.axisting.offlineregisterapp", Context.MODE_PRIVATE) // oncreate altı

Verileri getirirken uygulamanın hangi konumunda olursak olalım önce SharedPreferences nesnesi oluşturmamız lazım.

Bu kısımları eksiksiz yaptığımız durumda istediğimiz aktiviteden veya classtan artık verileri okuyabiliriz.

            val sharedName = sharedPref.getString("name","-1000")
            System.out.println(sharedName)

Bu şekilde kolaylıkla verileri okuyabiliriz. Bunu kontrollerle zenginleştirmek artık size kalmış.

Verileri Silmek (SharedPreferences)

Örneğin uygulamada kaydettiğimiz bu verileri bir delete butonu aracılığıyla silelim. Delete isminde bir button oluşturup delete isminde bir onClick methodu tanımlayalım. Bu delete() methodu şu şekilde olurdu.

 fun deletePerson(view : View) {
        val sharedName = sharedPref.getString("name","-100")
        val sharedSurname = sharedPref.getString("surname","-100")
        val sharedAge = sharedPref.getInt("age",-100)
        val sharedEmail = sharedPref.getString("email","-100")
        val sharedPassword = sharedPref.getString("password","-100")
        if (!sharedName.equals("-100")){
            sharedPref.edit().remove("name").apply()
        }
        if (!sharedSurname.equals("-100")){
            sharedPref.edit().remove("surname").apply()
        }
        if (sharedAge != -100){
            sharedPref.edit().remove("age").apply()
        }
        if (!sharedEmail.equals("-100")){
            sharedPref.edit().remove("email").apply()
        }
        if (!sharedPassword.equals("-100")){
            sharedPref.edit().remove("password").apply()
        }

        Toast.makeText(applicationContext, "Paylaşılan Veriler Silindi..", Toast.LENGTH_SHORT).show()



    }

Not : Bu şekilde offline kayıt olma uygulamasının tamamını doldurabiliriz. Ben tam halini github hesabımda da paylaşacağım.

Bir sonraki derste aktiviteler ve yaşam döngülerinden bahsedelim.

Github : https://github.com/axisting/OfflineRegisterProject

Bir cevap yazın