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 sqlite, Moor 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
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 Entity
sizin 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; Future
ya void
, int
ya da List<int>
.
@update
Bir güncelleme metodudur. Update size bu metodları döndürebilir; Future
, void
, int
ve List<int>
.
@delete
Bir silme metodudur. Delete bu metodları döndürebilir;Future
, void
, int
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ı:
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.
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.
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
Uygulamanın kaynak kodu:
Diğer Kaynaklar
Android developer için
Okuduğunuz için teşekkürler! Sorularınız varsa sorabilirsiniz veya beni buradan veya merttoptas.com’dan takip edebilirsiniz.