Flutter’da Floor Kullanımı — Sql Kütüphanesi

Flutter’da uygulama geliştirirken bazı verileri lokalde tutmak isteyebiliriz. Bu verileri lokalde bir veri tabanında tutmak için SQL’e ihtiyacımız var. Flutter sqliteMoor ve Floor kütüphaneleri SQL için çözüm üreten kütüphanelerdir.

Floor kütüphanesi, SQL kullanımı ile veritabanında tam kontrolü sağlayan bir Flutter kütüphanesidir.

Kullanım prensibi Google tarafından geliştirilen native Android için çözüm sunan Room kütüphanesine benzemektedir. Aslında çalışma itibariyle, Room’un Flutter’daki karşılığı diyebiliriz.

Çalışma Prensibi

Image for post

Veri depolama ve bunlara erişme prensibi Data Access Object (DAO) ve Database’dir.

İlk olarak Entity, bir static sınıf ve veritabanın tablosunu temsil etmektedir. DAO’lar ise bu Entity (Varlık) erişimini yönetir ve nesneler içinde tablo satırları arasındaki eşleşmeleri sağlar. Sorgular sayesinde database ile ilişki kurarak, ilgili sorguya ait veriyi getirmeye çalışmaktadır.

Database, temelde SQL veritabanın depolanma merkezidir. Bu depolama merkezinin erişim noktasıdır. DAO ile etkileşim haline gelerek uygulamayla haberleşir.

Kurulum

dependencies:
flutter:
sdk: flutter
floor: ^0.11.0

dev_dependencies:
floor_generator: ^0.11.0
build_runner: ^1.7.3
  • floor_generator veritabanı sınıflarını oluşturmak için kod içerir.
  • build_runner kaynak kod dosyaları oluşturmanın somut bir yolunu sağlar.

Model Oluşturma (Entities)

Bir veritabanın yapısını iyi kurgulamak gerekir. Veritabanın tablosu, uygulamadaki nesnelerin iskelesini temsil edecektir.

@entity sınıfı kalıcı bir sınıf olarak işaretler. Tablonuza primary keyi (birincil anahtar) eklemeniz gerekir.

autoGenerate: true ile primary key’in int değerinin otomatik şekilde artması sağlanır.

@ColumnInfo: Oluşturulan sütunlardır. Bir sütundan fazla oluşturulmasını istiyorsanız başına @ColumnInfo eklemeniz gerekir.

DAO

DAO’lar, Floor’u çalıştırırken verilerinize erişmek için kullanılır. Her DAO, verilerinizi işlemek için bir yöntem içermesi gerekir. Bu yöntemler, veriyi eklemek için INSERT, veriyi getirmek ve silmesi @Query’dir. Yani ekleme, güncelleme, silme.

Abstract sınıfı, döndürülmesi gereken veritabanını sorgulamak için yöntem biçimi içerir bu da Future'dır.

@Query Açıklamaları bir yönteme ekleyerek sorgu tanımlayabilirsiniz . SQL sorgusu parantez içinde eklenmelidir. Yöntem, return ederek Future ait Entitysizin için sorgulama ediyor.

findAllStudentsAsStream(): Stream ile list içinde, veritabanındaki verileri döndürür.

Veri İşlemleri

Veritabanına veri eklemek, silmek ve güncellemek için @insert@update ve @delete yöntemlerini kullanılır. Tek veya liste halinde işlem yapılmasına olanak sağlanır.

@insert Bir veriyi ekleme metodu olarak çalıştırır. Eğer büyük harflerle INSERT yazarsanız, bir çakışma yaşanır ve size bir hata döndürür. Son olarak insert bu metodları döndürebilir; Futureya voidint ya da List<int>.

@update Bir güncelleme metodudur. Update size bu metodları döndürebilir; Futurevoidint ve List<int>.

@delete Bir silme metodudur. Delete bu metodları döndürebilir;Futurevoidint ve List<int>.

Database

StudentDatabase class, db’yi temsil eder ve SQLite db ile bağlantı kurar.

  • Abstract sınıf olan FloorDatabase() sınıfından extend edilmesi gerekir.
  • @Database ile oluşan veritabanın tüm sınıflara erişmesinin listesini alır ve veritabanın versiyonun belirtilmesi gerekir.
  • Eğer veritabanında bir genişletme veya değişiklik yapıldığı taktirde bu versiyon kodunda değişiklik yapılması gerekir.

Son olarak, floor generatoru çalıştırın flutter packages pub run build_runner build. Bir dosya değiştiğinde otomatik olarak çalıştırmak için bunu kullanın flutter packages pub run build_runner watch.

Bu bölüme ne kadar neler yaptık? Floor’un yapısını inceledik ve örnek proje üzerinden ‘student.db’ isimli veritabanını oluşturduk. Kullanmak istediğimiz metodları (ekleme, silme ve güncelleme) ekledik.

Şimdi ise örnek proje üzerinden devam edelim.

Projenin yapısı:

Image for post

main.dart

finalstudentDatabase = await $FloorStudentDatabase
.databaseBuilder('student.db')
.build();

main metodu async metoddur ve bir await bekler. $FloorStudentDatabase ile ilgili veritabanını açılması için kullanılır. Eğer program açıldığında veritabanı açılmazsa Stream’dan gelen veri null olacağından hata alırız.

MyApp içine studentDao göndermenin nedeni ise MyApp başlatıldığında ilk hangi screen açılıyorsa oraya studentdao’yu göndererek veritabanın main() metoduyla birlikte başlatılmasını sağlamaktır.

Model Oluşturmak

Veritabanın tablolarının yapısını oluşturmak için model oluşturmak gerekir. Burada dikkat edilmesi gereken nokta @PrimaryKey’in, autoGenerate: true olarak ayarlamaktır. Id’in otomatik olarak verilmesini sağlar.

HomeScreen Ekranını Oluşturma

Ekranda iki input alan bir text field ve kaydetmek için save butonu olacak. Aynı ekranda da veritabanındaki veriyi göstermek için Listview.builder kullanacağım.

Image for post
Son Hali
class _HomeScreenState extends State<HomeScreen> {

String _name;

String _school;

Student student;

List<Student> listStudent;

final formKey = GlobalKey<FormState>();

StudentDatabase studentDatabase;
StudentDao studentDao;

_HomeScreenState(this.studentDao);

Açıklamak gerekirse, onSaved: (input) => _name=input ile form içindeki inputları _name değişkinine atıyoruz. GlobalKey kullanmanın nedeni ise form widgetı kullandığımız için bir key ister, formKey sayesinde bu widget içindeki inputları dinleyebilmemize olanak sağlamaktadır.

Kaydet butonu ve insert işlemi

RaisedButton içerisinde, zorunlu olarak onPressed metodunu istemektedir. OnPressed ile butona tıklandığı zaman olan işlemlerdir. Name ve school stringi içerisinde daha önce inputa atadığımız değişkenleri yakalayıp, patient içinde atılır.

insertStudent() metodu bir Student istediği için patient olarak göndeririz. Böylelikle studentDao.insertStudent(patient) ile kayıt işlemi yapılır.

Listede Gösterme

stream: studentDao.findAllStudentsAsStream(),

StreamBuilder kullandığımız için, findAllStudentAsStream metodunu çağırıyoruz. Stream<List<Student>> şekilde dönmektedir.

Image for post
List Görünümü

Silme İşlemi

Basılan ilgili positiondaki name ve school’u içeren id’yi yakalayabiliyoruz.

int id = students[index].id;

Bu id ile ilgili positiondaki verinin id’sini yakaladık. Daha sonradan studentDao.deleteStudent(patient); ile silmeyi gerçekleştirdik.

Ve Son Hali

Image for post

Uygulamanın kaynak kodu

https://github.com/merttoptas/floor_example

İnternet sitesi https://www.merttoptas.com
Yazı oluşturuldu 17

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Benzer yazılar

Aramak istediğinizi üstte yazmaya başlayın ve aramak için enter tuşuna basın. İptal için ESC tuşuna basın.

Üste dön
%d blogcu bunu beğendi: