Kullanıcılar için verilerin kaydedilmesi çok önemlidir. Kullanıcıların uygulamaya her girişlerinde bilgilerini tekrar kaydetmesi veya verilerinin tekrar yüklenmesini beklemesi kullanıcılar için can sıkıcı bir durum olabilir. Bu ve bunun gibi durumlarda verileri yerel olarak kaydetmek daha mantıklıdır.
Bu yazıda SQLite ile veri kaydetmeyi göstereceğim.
SQLite verileri yerel olarak depolamanın en yaygın yöntemlerden biridir. SQLite bir Flutter projesinde kullanmak için aşağıdaki adımları takip edebilirsiniz.
1. Paketi projeye ekle
Projede pubspec.yaml
dosyasına gidin ve dependencies
kısmının altına,sqflite
ve path_provider
paketlerinin güncel versiyonlarını ekleyin.
dependencies : sqflite: “güncel versiyon”,
path_provider: "güncel versiyon"
2.Veritabanı Oluşturma
Daha sonra bir veri tabanı oluşturalım ve openDatabase()
kullanarak bir veritabanı açalım.
openDatabase()
metodu; veritabanı dosyasının yoluna ulaşılmasını sağlayan, veritabanının taşınmasını ve yükseltilmesini kolaylaştıran, veritabanının sürümü ve veritabanı başarıyla oluşturulduğunda, çağrılacak bir geri çağırma işlevini gerçekleştirebilen bazı parametreleri sağlar.
3. Veritabanı Tablosu Oluşturma
İlk olarak önceki örnekte callback (geri çağırma) olarak belirttiğimiz populateDb()
fonksiyonunu tanımlayalım.
Yukarıdaki örnekte ilk veritabanı sorgusunu Customer olarak çağrılan 4 sütunlu bir tabloya karşı yaptık.
4. Veri Modeli Ekleme
CRUD operasyonlarını oluşturmadan önce bir model eklemeliyiz. Flutter projesinde customer.dart isminde bir dosya oluşturup Costumer adında bir class tanımlayalım.
5. CRUD Metodlarını Ekleme
CRUD operasyonlarını çalıştırmak için farklı yaklaşımlar kullanabiliriz. Bu yaklaşımları her operasyonun altında işleyelim.
Create Operasyonu
Örnek olarak veritabanı tablosuna customer nesnesini ekleyelim.
insert()
metodu:
Future<int> createCustomer(Customer customer) async {
var result = await database.insert("Customer", customer.toMap());
return result;
}
Gördüğünüz gibi, sadece Costumer nesnesini map‘e dönüştürüyoruz (Costumer modelinde tanımladığımız toMap()
yöntemini kullanarak) ve bunu tablo ilk gelen parametre, veri ise ikinci parametre olarak insert() metoduyla tabloya ekliyoruz.
rawInsert()
metodu:
rawInsert()
yöntemi, düz SQLite’de yaptığımız gibi INSERT sorgularını çalıştırmamıza izin verir.
createCustomer(Customer customer) async {
var result = await database.rawInsert(
"INSERT INTO Customer (id,first_name, last_name, email)"
" VALUES (${customer.id},${customer.firstName},${customer.lastName},${customer.email})");
return result;
}
Read Operasyonu
a. Read (All) Operasyonu:
Veritabanındaki birinci parametreye göre verilerin okunmasını sağlar.
query()
metodu:
Bu metod tablonun ismini ve sütunlarını aldıktan sonra veriyi döndürür.
Future<List> getCustomers() async {
var result = await database.query("Customer", columns: ["id", "first_name", "last_name", "email"]);
return result.toList();
}
toList()
metodunu sonucu bir dart List haline getirmek için kullanabiliriz.
rawQuery
metodu:
rawQuery()
yöntemi, düz SQLite’de yaptığımız gibi QUERY sorgularını çalıştırmamıza izin verir.
Future<List> getCustomers() async {
var result = await database.rawQuery('SELECT * FROM Customer');
return result.toList();
}
b. Read Operasyonu byId:
Veritabanından Costumer nesnesini aldıktan sonra, bu nesneleri tanımlayıcılarıyla birlikte tek tek almamız gerek.
query()
metodu:
Tabloyu birinci parametre, sütunları ikinci parametre olarak belirtmiştik. Şimdi ise bir where parametresi ekliyoruz.
Future<Customer> getCustomer(int id) async {
List<Map> results = await db.query("Customer",
columns: ["id", "first_name", "last_name", "email"],
where: 'id = ?',
whereArgs: [id]);
if (results.length > 0) {
return new Customer.fromMap(results.first);
}
return null;
}
Costumer nesnesinin id
tanımlayıcısına sahip olmasını istiyoruz, bu yüzden id = ?
ifadesini ekliyoruz. ? sembolü, whereArgs argümanından elde ettiğimiz gerçek değerle değiştirilir.
rawQuery
metodu:
Future<Customer> getCustomer(int id) async {
var results = await database.rawQuery('SELECT * FROM Customer WHERE id = $id');
if (results.length > 0) {
return new Customer.fromMap(results.first);
}
return null;
}
Uptade Operasyonu:
Where ifadesinde belirtilen belirli bir elemanın güncellenmesini sağlar.
uptade
metodu:
query()
metoduyla benzerdir. Bu metodu verilerin güncellenmesi için kullanırız.
Future<int> updateCustomer(Customer customer) async {
return await database.update("Customer", customer.toMap(), where: "id = ?", whereArgs: [customer.id]);
}
rawUptade
metodu:
Future<int> updateCustomer(Customer customer) async {
return await database.rawUpdate(
'UPDATE Customer SET first_name = ${customer.firstName} WHERE id = ${customer.id}'
);
}
Delete Operasyonu:
Veritabanından belirtilen elemanın silinmesini sağlar.
delete
metodu:
Future<int> deleteCustomer(int id) async {
return await database.delete("Customer", where: 'id = ?', whereArgs: [id]);
}
rawDelete
metodu:
Future<int> deleteCustomer(int id) async {
return await db.rawDelete('DELETE FROM Customer WHERE id = $id');
}
6. Veritabanını Kapatma:
Veritabanındaki işlemler bitti ise aşağıdaki kod satırı ile veritabanını kapatabilirsiniz.
await database.close();
Özetle bu yazıda bir Flutter projesinde SQLite komutlarını ve CRUD operasyonlarıyla veritabanında çalışmayı anlatmaya çalıştım.
Yazının orjinali: SQLite Database CRUD with Dart and Flutter