Android SQLite – 1

Android Persist  – SQLite

Merhaba arkadaslar, bu yazımda Android içerisinde sqlite nasıl kullanılır ona değineceğim.

SQLite nedir?

SQLite ; hızlı , güvenilir , performanslı , ücretsiz ve open source’dır .

Android içerisinde gömülü olarak gelir . Mobil cihazlar(Android , IPhone) için en ideal veritabanı seçimi SQLite olacaktır.

Not : Diğer database türleride tabiki de kullanılabilir . 

Öncelikle geliştirme yaptığınız ortam için sqlite indirip konsoldan birkaç alıştırma yapmamız iyi olacaktır.

Linux için : apt-get install sqlite 

Ardından terminalden sqlite yazıp çalıştıralım;

2014-12-02 20:22:14

 

Terminal üzerinden birçok işlem yapılabilir. Bunlara örnek olarak; tablo oluşturma, silme, backup alma, tablo yada database’leri listeleme vs. Fazlası için buraya bakınız.

Bugün örnek bir uygulama üzerinden sqlite yapısına bakıcaz. Uygulamaya geçmeden önce bir tablo oluşturup alıştırma yapalım.

2014-12-02 20:28:07

SQLite data tiplerine bakmak için ziyaret ediniz.

* Şimdi ise Android-SQLite ikilisine gelelim

Android , standart olarak SQLite ile birlikte gelmektedir. SQLite dataları cihaz üzerinde text file olarak tutar.

Uygulamamız içerisinde direkt olarak databases oluşturabiliriz. Bunun en kısa yolu SQLiteOpenHelper sınıfınıdır.

SQLiteOpenHelper abstract bir class olduğu için sınıfın nesnesini oluşuturamayız. Extends etmemiz lazım , edelim

Önemli not : 3 adet methodu implemente etmek zorundayız. Bunlar;

  1. Database’ye nasıl bağlanacağımız.  (Constructor method)
  2. Tabloları oluşturmak. (onCreate method)
  3. Önceki versionu upgrade etmek. (onUpgrade method)

CityDBHelper.java

Not 0 : Constructor db adı ve versionu verilmelidir. Version >=1 olmalıdır.

Not 1 : Tablo onCreate methodu çağrılarak oluşturulmaz, sınıftın nesnesi oluşturulduğunda tablo otomatik olarak oluşturlacaktır.

Not 2 : Database , cihazda /data/data/<package-name>/databases<database-name> altında tutulur.

Örnek uygulama;

Uygulamamızda Şehir bilgisini tutacaktır. Bunun için onCreate methodu içerisinde basit bir tablo yapısı oluşturduk. Daha önce ActvityForResult, Option Menu, Custom Adapter ve Layout kısımları için yazılar yazmıştım, onun için onları es geçerek dabatase kısmına ağırlık vermek istiyorum.

Main layoutumuzda listview bulunmakta ve option menu olarak add city ile diğer activity(AddCity) açılmakta. Diğer activityden eklenen city alınarak veritabanına kayıt edilecektir.

2014-12-02 21:31:58

 

MainActivity.java

 

* CityBean , name ve code değişkenlerine sahip basit bir java sınıfıdır.

AddCity.java

AddCity layotumuza bakalım;

2014-12-02 21:44:49

AddCity’den dönen verileri MainActivityde onActivityForResult ile karşılamktayız.

** Dikkatinizi çekmesi gereken nokta Database classımızın nesnesi üzerinden yaptıgımız insertCity işlemi olmalıdır. O methoda bakalımİ;

Not :  Database objesi almak için kullanabileceğimiz iki method bulunmaktadır. Bunlar; getWritableDatabase() getReadableDatabase().

  • getReadableDatabase() : Read only.
  • getWritableDatabase()  : Read and write.

2014-12-02 21:52:14

* Bu şekilde city objemizi City tablomuza eklemiş bulunuyoruz. Bir diğer insert yapma yolu ise ContentValues kullanmaktır. Karışık ve daha kompleks sql ifadeleri hataya açıktır. Bunu iyileştirmek adına ContentValues kullanmalıyız.

* Aynı ekleme işlemini bu şekilde de yapabiliriz. Bu yolu tercih etmelisiniz. Sql ifadesini okuyabilmek bile bir başarı

Şimdi de verileri nasıl çekeceğimize bir bakalım;

* rawQuery methodu ile tablomuzu okuyaibiliriz. Bize bir Cursor objesi dönecektir. Cursor objesi üzerinde hareket ederek tüm kayıtları teker teker okuyabiliriz.

* Şimdilik bu kadar yeterli, bir sonraki sqlite yazısında güncelleme ve silme işlemlerini göstermek istiyorum.

* Örnek uygulamanın kaynak kodları : SQLiteTutorial

2014-12-02 23:19:53

 

* Mutlu kalın, kod’la kalın ve bol bol Çay için(çay önemli)

~ Görüşmek üzere, Alican Akkus.

 

2855 Total Views 1 Views Today

  • ubarez

    Merhaba Alican Bey;

    Ben VERİTABANI kulllanmadan,
    1 – Etiket,
    2 – Değer 1,
    3 – Değer 2,

    tutmak ve tabi daha sonra da ARAMA ve bulunanı SIRALAMAK istiyorum.
    Başka bir ifade ile, 3 veri saklayacak bir ŞEY’e ihtiyacım var. Epey araştırdım fakat
    işin içinden çıkamadım.
    Demek istediğim: Bu iş için List mi, ArrayList mi, Map mi, HashMap mi yada bazılarının
    BİRLİKTE KULLANIMI mı gerekiyor? Bunu çözemedim. Çözemedim, çünkü bunlar İKİLİ
    DEĞER İLE çalışıyor. Fakat bazı INGILIZCE örneklerde List ve ArrayList veya Map’in BİRLİKTE KULLANIMI’nda 3’lü veya daha fazla değer (MultiValue) tutulabildiğini gördüm. Fakat gördüklerim KARMAŞIK geldiği için ANLAYAMADIM.

    Hiç bir tane de TÜRKÇE ÖRNEK GÖRMEDİM !

    Acaba siz yardımcı olabilir misiniz?
    Çok minnettar kalacağım.

    Çalışmalarınızda kolaylıklar dilerim.

    • Alican Akkuş

      Selamlar,

      Yukarıdaki 3 veriyi(Etiket, Değer 1 ve 2) sarmalayacak bir class oluşturmalısınız. Açıklamaya çalışayım. Yukarıdaki verileri içerecek bir class oluşturunuz. Class adı ihtiyaca göre olabilir, Ürün olabilir mesela.

      List yada Map ikiside ihtiyacı görür ancak benim önerim neye ihtiyaç duyuyorsanız ona göre seçim yapmalısınız. Ben olsam şöyle yapabilirim mesela;
      Etiket verisi her obje için unique(tekil/ayırt edici) ise Map’de tutabilirim. Map’de key olarak etiket’i, value olarak da objenin kendisini tutabilirim. Değilse klasik Liste yapabilirim.

      List’de işinizi görebilir, öncesinde ufak birkaç Collections örneği yapabilirsiniz. Performans olarak List’de arama O(n)’dir, Map de ise key-value oldugundan O(1)dir. Map, arama konusunda hızlıdır ancak daha fazla memory kullanır.

      Şuraya http://paste2.org/Y3w4pBhf ufak bir örnek ekledim, umarım faydası olur. Fikir verir.

      ^^ Son olarak bey vs demenize gerek yok, abi/kardes daha iyi

  • ubarez

    Merhaba Kardeş;

    İlgi gösterip yanıt yazdığınız için çok teşekkür ederim.
    Hatta daha da uğraşıp kod yazmışsınız; sizi uğraştırmışım
    kusura bakmayın. Ayrıca, samimiyetiniz için de teşekkür ederim.

    Gelgelelim…Nereye gelelim Benim ihtiyacım olan, deyim
    yerindeyse ‘mekanizma’, Sarmalayan Sınıf değil.

    Şu adreste olan gibi bir mekanizma:

    > https://examples.javacodegeeks.com/core-java/util/hashmap/java-hashmap-example/

    “Map ve List” veya “Map ve ArrayList” veya “HashMap ve
    ArrayList” gibi, artık hangisi yada hangileri ile olacak-
    sa… Hangisini kullanmam gerektiğini bilemiyorum ama,
    burada kullanılan HashMap ve ArrayList sanki işimi görecek
    gibi. ARALARINDAKİ BAĞLANTIYI KURABİLSEM, sorunu çözeceğim
    zaten Belki sadece List ve Map yeterli gelecek?!
    Ama işte, önümde ANLAMLANDIRAMADIĞIM bir DUVAR VAR ve ben
    ona TOSLAYIP DURUYORUM !

    NEDİR ANLAMADIĞIM:

    Örneğin o sayfada verilen örnekte: HashMap ile ArrayList
    ARASINDAKİ BAĞLANTI’yı NASIL kurduğu? Birine KEY’leri gi-
    riyor, birine VALUE’ları giriyor. Sonra bunları BİRLEŞTİ-
    RİYOR.

    “Şu VALUE’lar, şu KEY’e AİTTİR” bağlantısını kurup, ekrana
    listeliyor. İşte bu mekanizmayı bi türlü anlamadım.

    BELEŞÇİ BİRİ olduğumu zannetmeyin! Sırf bunun için, Timur
    KARAÇAY’ın Java’da Veriyapıları (JCF : Java Collections
    Framework) kitabını aldım. Üstelik Ocak 2016 baskısı. Ama
    maalesef, size verdiğim linkteki örnek gibi bir örneğe rast-
    lamadım. Yani MULTIVALUE anlatan bir örnek.

    Ben de, “bari konuyu işleyen kişilere bi danışayım. Belki
    yardımcı olacak bir arkadaş bulabilirim” düşüncesiyle dola-
    nırken, sizin sayfanıza rastladım.

    Sonuçta bu noktadayız.

    Yardımcı olursanız, minnettar kalacağım.
    İngilizce Kaynak (site veya kitap) da gösterebilirsiniz.

    Çalışmalarınızda kolaylıklar dilerim.

    • Alican Akkuş

      Tekrardan selamlar,

      Linkteki örneği inceledim. Şöyle ifade edeyim.

      Map yapısı itibari ile formatındadır. Key-Value şeklinde. K ve V obje olduğu için istedigin bir objeyi tutabilirsin. Örnekte V olarak ArrayList kullanılmış, String olabilir baska herhangi bir obje olabilirdi.

      Şöyle anlamaya çalış, bir ailede bireylerin soy adları baba’nın soy adıdır. Sen bir ailede bulunan üyeleri tutmak istiyorsun. Key olarak soy adını(tek bir adet) value olarak ise aile bireylerinin isimlerini tutman lazım(birden fazla, o yuzden liste gibi bir yapı olmalı)

      Mesela;
      ArrayList bireyler = new ArrayList();
      bireyler.add(“alican”);
      bireyler.add(“merve”);
      bireyler.add(“umut”);

      gibi bir listen var. Map de tutmak için ise;
      Map<String, ArrayList> familyMap = new Map<String, ArrayList>();
      familyMap.put(“Akkuş”, bireyler);
      ^^ Yukarıda Akkuş ailesini bir map de tuttuk. Aramak istedigimizde “Akkuş” a göre arama yapacagız. Map’de var ise aile bireylerinin bulundugu listeyi bize dönecektir.

      Buna benzer olarak Map’e başka aileler de eklenebilir.

      Kolay gelsin.

  • ubarez

    <<>>

    Merhabalar Kardeş;

    Ben ECLIPSE kullanıyorum. Neden? Çünkü bir arkadaşım bir Proje
    verdi ve ECLIPSE PROJESİ OLACAK dedi. Allah’ın dediği olur

    Artı, JDK 8 kurdum, Kodları Çalıştırmak İçin JDK 8 adlı bu arkadaştan
    yararlanıyoruz.

    Bunları neden söyledim? Çünkü sizin yazmış olduğunuz şu satırda:

    Map<string, arraylist> familyMap =
    new Map<string, arraylist>();

    iki HATA verdi. “BELKİ JDK8 Nedeniyledir” diye düşündüm

    1 – “Multiple markers at this line”
    başlığı altında 6 HATA!
    Örnek: invalid Assignment Operator ‘>>’
    Ve diğerleri…

    ÇÖZÜM: string’den sonraki = ve “” karakterlerini silince düzeldi.
    BAŞKA HATALAR BELİRDİ.
    ÇÖZÜM : string kelimesinin BAŞ harfi ile array’ın ve list’in
    BAŞ harflerini BÜYÜK yapınca düzeldi.

    2 – cannot instantiate the type Map<String, ArrayList>
    Bu hatayı bilmediğim için google’da arattım.

    ŞURADA:
    > http://stackoverflow.com/questions/19598369/cant-instantiate-map-well-why-not

    Birisi:
    “The built-in Map is an interface, which cannot be instantiated”
    demiş. Hımmm!..

    “Map bir Interface’dir ve Interface’in instance’ı alınamaz”
    mealinde birşeyler söylüyor!

    ÇÖZÜM:
    Map<String, ArrayList> multiKardes =
    new HashMap<String, ArrayList>();

    Hata DÜZELDİ!

    Biliyorum, bunları beni denemek için yaptınız
    Bakalım ne kadar biliyorum diye, di mi
    Seni gidi seni…

    (Devamı var…)

  • ubarez

    <<>>

    BURADA KOD BULUNMAKTADIR !
    ——————————————-

    package java_ogreniyorum;

    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import java.util.Map.Entry;
    import java.util.Set;

    public class MultiKardes {

    public static void main(String[] args) {

    Map<String, ArrayList> multiKardes = new HashMap<String, ArrayList>();
    ArrayList uyeler = new ArrayList();

    uyeler.add(“alican”);
    uyeler.add(“merve”);
    uyeler.add(“umut”);

    multiKardes.put(“AKKUŞ”, uyeler);

    //Girdi’leri, Key ve Value İKİLİSİ olarak Set’e aktar
    Set<Entry<String, ArrayList>> setMap = multiKardes.entrySet();
    //iterator kur
    Iterator<Entry<String, ArrayList>> iteratorMap = setMap.iterator();

    System.out.println(“nMulti Değerli HashMap!”);
    //iterator ile döngüde gezinme; Key ve Value alımı; Ve elemanların gösterimi
    while(iteratorMap.hasNext()) {
    Map.Entry<String, ArrayList> entry =
    (Map.Entry<String, ArrayList>) iteratorMap.next();
    String key = entry.getKey();
    List values = entry.getValue();
    System.out.println(“Key = ‘” + key + “‘ ÜYELER: ” + values);
    }
    }
    }

    Bu kod DOĞRU ÇALIŞIYOR.
    Ama yine de bu onun DOĞRU YAZILDIĞI anlamına GELMEYEBİLİR!
    Siz bi inceleyip, “Baştan sona doğru” yada “şurası yanlış” yada
    “şurada onun yerine şunu kullansaydınız, kodlar çoğaldığında
    sorun çıkma riski ortadan kalkardı” gibi bir değerlendirme yapabilr
    misiniz, rica etsem ?

    Çalışmalarınızda kolaylıklar dilerim.

  • ubarez

    ÇÖZÜM:
    Map<string, arraylist> multiKardes =
    new HashMap<string, arraylist>();

    Yazdığımız kodlara HTML müdahale ediyor herhalde! Çünkü yukarıdaki kodda,
    String’in, Array’in ve List’in BAŞ harflerini BÜYÜK yazmama rağmen, bu sayfada
    küçük harflere dönüştürüldü. Bu da yetmedi; “sizin hatanız” olarak gördüğüm bu
    yanlışlardan diğeri, yani String’den sonraki = ve “” karakterlerini ben SİLİP de
    kodu buraya yazdım. Ama HTML amcamız onları yine oraya koymuş!

    Demek ki sizain hatanız değilmiş! “Öyle düşündüğüm için kusura bakmayın”
    diycem ama, HTML’in de kalkıp böylesine bir müdahalede bulunacağı HİÇ aklıma
    gelmezdi doğrusu.

    Neyse.
    Tekrar görüşmek dileğiyle.

    • Alican Akkuş

      kolay gelsin kardes

  • ubarez

    Merhaba Kardeş;

    Peki Android’de, Preferences’e, Map yada HashMap kullanarak
    MultiValue kayıt yapılabiliyor mu?

    Kolay gelsin.

  • ubarez

    Selamlar;

    Java’da MultiValueMap ile nasıl kayıt yapacağımızı öğrendik.
    Aynısını Android SharedPrefernces’e aktarayım dedim ama,
    “Obje Kabul Etmez” duvarıyla karşılaştım. Hadiiii!..
    Sağa sola baktım biraz, bu işin bi çözümü varmış ama,
    bana biraz kulağı ters kolla göstermek gibi geldi: Gson,
    Json kullanacakmışsın falan…

    Sonunda yine SQLite’a kaldık! Başka çözüm görünmüyor.
    İşimizi bununla halledeceğiz.

    Kolay gelsin.