Flutter'da Local Veritabanı - Sqflite




Neler yapacağız?


Bugün mobil cihazımızın local veritabanında nasıl veri tuttuğunu, tuttuğumuz bu bilgilerle nasıl işlem yapılabileceğini göreceğimiz örnek bir uygulama hazırlayacağız.


Bazen uygulamanızın cihaza küçük verileri kaydetmesi gerekebilir. Yapılandırılmış bir veriyse SQL veritabanı kullanmak isteyebilirsiniz. Çoğu cihazda (mobil cihazlar dahil) Sqlite gibi bir SQL veritabanı motoru kullanılabilir. Flutter geliştiricilerinin Sqlite kullanabilmesi için geliştirilen paket Sqflite'dır.


Sqflite, Flutter için bir veritabanı plugin'idir. Kullandığımız cihazın belleğinde çalışan local bir veritabanıdır. Veritabanında veri ekleme, güncelleme ve silme gibi crud operasyonlarını gerçekleştirir. Gelin uygulayarak Sqflite'ı inceleyelim. Projemiz Sqflite'ı anlamak adına basit işlevli bir not uygulaması olacak. İlk olarak yeni bir Flutter projesi oluşturarak başlayalım. Ben projeyi "sqflite_demo" olarak adlandırdım.


Entegrasyon


Başlangıçta projemize kullanacağımız Sqflite paketini ekleyelim. Flutter paketleri için "pub.dev" adresinden sqflit paketini kullanacağız.



Sonrasında projemizde "pubspec.yaml" dosyasına giderek dependencies altına "sqflite:^1.3.1+1" ve bize ilgili veritabanın yolunu vermeye yarayan "path:^1.7.0" paketini ekliyoruz.


dependencies:
 sqflite: ^1.3.1+1
 path: ^1.7.0

Ardından "Control + S" tuş kombinasyonu ya da

$ flutter pub get

komutu ile paketimizi kuruyoruz. Hadi kodlamaya geçelim!


Uygulamamızın temel sınıfı: Notlar


Artık kodlarımızı yazmaya başlayabiliriz. Projemizde lib klasörü içerisine kullanacağımız klasörleri oluşturarak başlayalım. Bunlardan ilki models isimli klasörümüz olacak. Buraya "notes.dart" adında bir dart dosyası ekleyelim. Ve Notes sınıfımızı oluşturalım.


Burada nesnemizi, constructor'larımızı ve database'den nesnemizi alırken ve yazdırırken bize yardımcı olacak methodlarımızı yazalım.




Veritabanımızla Çalışmamızı Sağlayacak Database Helper Nedir? Haydi oluşturalım!


Models klasöründen sonra utils adında yeni bir klasör oluşturup, "dbHelper.dart" adlı yeni bir dosya ekliyoruz. Sürekli olarak veritabanıyla çalışan dosyalar için genelde database helper isimlendirmesi kullanılır. Biz de, veritabanına bağlanmayı, veritabanı üzerinde işlemler yapmayı sağlayacak bu yardımcı sınıf için bu isimlendirmeyi kullanalım.


Bu sınıfta Singleton Design Pattern'dan yararlanacağız. Yani uygulamayı her kullandığımızda bu sınıftan oluşturulması planlanan nesneler, sınıf üzerinden bir kere oluşturulur ve sonraki işlemlerde bu nesne üzerinden devam edilir. Bu sayede bellekte devamlı yer kaplamanın önüne geçilecek. Burada veritabanımızı getirecek, veritabanımızı kuracak methodlarımızı ve insert, update ve delete methodlarımızı ekleyelim.


İlk olarak database nesnemizi tanımlayarak başlıyoruz. Statik olarak tanımlıyoruz çünkü şuanda nesne oluşturmadan devam etmek istiyoruz. Nesneleri daha sonra methodlarımızın içinde oluşturacağız.


Ardından, ilerde tablomuzu oluştururken kullanacağımız tablo adlarını ve sütun adlarını String birer değişken olarak tanımlıyoruz.



Kodumuzun devamında 3 adet method göreceğiz. Bunlar temel olarak veritabanını getiren, başlatan ve oluşturan asenkron methodlarımız. İlk olarak bir getter methodu olan "get database()" methodumuzu kontrol ederek başlatıyoruz. _database'imiz null ise "_initializeDatabase()" methodunu çağırıyoruz.


"_initializeDatabase" methodunda mobil cihazımızın hafızasında bulunan database'e ulaşmamız gerektiği için getDatabasePath() methoduyla klasör yolu elde ediyoruz. Ardından join methoduna parametre olarak az önce elde ettiğimiz yolu ve oluşturacağımız database'in ismini göndererek dbPath'i elde ediyoruz. Artık database path de elimizde olduğuna göre database'imizi oluşturacak olan openDatabase methodunu çağırıyoruz.


openDatabase methoduna parametre olarak bir path, "version:" ve ilk kez oluşturulacaksa "onCreate:" parametreleri isteniyor. Biz de dbPath'i, versiyon değerini (1) ve database tablosunu oluşturmak için "_creatDb" methodunu gönderiyoruz. "_creatDb" methodunda ise yolu belli olan database üzerinden execute methodu ile bir tablo oluşturuyoruz. Eğer uygulama tekrar çalıştığında bu tablo varsa tekrar oluşturulmuyor, var olanı kullanmaya devam ediyor. execute methodu içinde bir SQL komutu ile tablomuzu oluşturacağız. Burada id değerini primary key olarak atıyoruz ve diğer sütun isimlendirmelerini yazıyoruz.



Ve ardından database'imiz hazır olduğuna göre crud işlemlerimizi yazalım.




Arayüzü Oluşturmak ve Crud İşlemlerinin Arayüze Uygulanması


Artık veri işlemlerimiz tamam, şimdi ise kullanıcının göreceği arayüzümüzü hazırlayacağız ve anasayfamızda dbHelper yardımı ile verilerimizi bir List yapısına aktarıp, sayfamızda göstereceğiz. Anlaşılma açısından kolay olabilmesi için tek bir sayfada ekleme, güncelleme, silme ve listeleme işlemlerini gerçekleştireceğiz. Kodumuz biraz uzun olacağı için parça parça sizlere aktarmak istiyorum.


İlk olarak screens isminde bir klasör açarak, "home_page.dart" şeklinde bir dosya oluşturuyoruz. Daha sonra uygulamamızda devamlı yapı değişebileceği için (Not ekleme, güncelleme ve silme sonrasında veritabanımız ve list yapımız değişecektir) sınıfımızı inşa ederken StatefulWidget'tan extends ediyoruz.


  • İlk olarak uygulama boyunca kullanacağımız nesneleri ve değişkenlerimizi oluşturuyoruz. Bunlardan ilki veritabanımızla ve daha önceki adımda yazdığımız databaseHelper sınıfı ile iletişime geçebilmek için bir databaseHelper nesnesi.


  • İkinci olarak başta oluşturduğumuz temel yapımız olan "Notes" tipinde bir liste yapısı. Bunun sebebi veritabanından gelen veriyi bu listeye aktarıp ekranda listelemek.


  • Daha sonra kullanıcıdan veri alacağımız form yapıları için TextEditingController ve FormKey.


  • Daha sonra da update methodunda bize yardımcı olması için tıklanılan liste elemanının id değerini tutucak integer tipinde değişken tanımlıyoruz.



Devamında sayfamız başlatıldığında çalışacak olan initState methodu içinde "getNotes()" methodunu çağırıyoruz. Burada databaseHelper'da yazdığımız getAllNotes methodunu kullanarak tüm verileri çekmesini ve ardından bu verileri az önce oluşturduğumuz allNotes isimli listeye aktarmasını sağlıyoruz. Gerçekleşen işlemleri ekrana yansıması için "this.allNotes = data" işlemini setState içinde gerçekleştiriyoruz.



homePage dosyamızda sıradaki işlemimiz, yapımızı inşa etmek olacak. Burada yukarıda basit bir form yapısı, altında butonlarımız ve onun altında da list yapımız bulunacak. Karmaşıklığa yol açmaması ve kodumuzun şık görünmesi adına tekrarlayan yapılar için kendi yazdığımız widgetları kullanacağız. Kullanıcıdan not başlığı ve açıklaması alacağımız kısım için bir form widget'ı oluşturacağız. Oluşturduğumuz widget'a textEditingController ve bir string'i parametre olarak göndereceğiz.


Buton widgetını oluştururken ise bir string, bir renk ve butona basıldığında çalıştırılması için bir method göndereceğiz. Burada güncelleme butonumuzda kullanıcı, bir not seçmeden güncelleme işlemi yapmaya çalışırsa bir alert methodu ekledik.



Butonlarımızın içine gönderdiğimiz methodlarda crud methodlarımızın çağrıldığını görüyorsunuz gelin homePage dosyamızda crud methodlarımızla devam edelim.


Burada sayfanın başında tanımladığımız "_databaseHelper" yardımıyla dbHelper sınıfındaki methodlarımıza ulaşarak gerekli işlemleri gerçekleştireceğiz. Buradaki methodlarımızı da işlemlerin gerçekleşmesi uzun sürebileceği için yine asenkron olarak tanımlıyoruz.


Yeni eklenmiş, güncellenmiş veya silinmiş elemanın bilgilerini veritabanına bildirdikten sonra buradaki listemize de eklemesi için ekleme ve güncelleme işlemlerinden sonra setState içinde getNotes methodunu çağırıyor ya da silme işleminde veritabanından sildikten sonra setState içinde getNotes'u çağırarak silinen elemanın list yapımızdan çıkarılmasını sağlıyoruz.


Yani her işlemden sonra setState içinde getNotes diyerek veritabanının en güncel halini list yapımıza aktarıyoruz.


Ayrıca ekleme ve güncelleme işlemlerinde butona basıldıktan sonra TextFormField'ların boş kalması için setState'lerde form için doldurulan kısımları da tanımladığımız controller'lar sayesinde boşaltıyoruz.


SetState(), Durumun değiştiğini class'ımıza bildiren method.


Artık arayüzümüz ve arayüzümüze uygulanan crud işlemleri tamam. Son olarak main.dart dosyasında MaterialPage'in body kısmında HomePage()'imizi çağırıyoruz.



Uygulamamız hazır, hadi göz atalım 👨‍💻



Yazımızın sonuna geldik. Aklınıza takılan veya merak ettiğiniz soruları yorumlar kısımında sorabilirsiniz.


Projenin GitHub Reposu :

https://github.com/hasanalisiseci/sqflite-demo-flutter


Kaynaklar :

https://pub.dev/packages/sqflite

https://pub.dev/packages/path


#flutter #sqflite #sql #sqlite #localdatabase #crud

1 yorum

Komünite

Platform

Mobiler.dev Anasayfa
  • Twitter
  • Instagram
  • development_düzenlendi_düzenlendi
  • Youtube
  • slack-icon-black_edited_edited_edited
  • Gri LinkedIn Simge
imageedit_2_9667998092.png
JetBrains Hakkında Detaylı Bilgi Alın

© 2020 by mobiler.dev

Kurumsal Yazar Hesapları

adesso.png
mobilerdevLogo.jpg
Yazarlık Başvurusu Hakkında Bilgi Alın, Başvuru Yapın.
Topluluk Yazarlarını Tanıyın