23 Haziran 2014 Pazartesi

XE5 Mobil Uygulamada SQLite Veritabanı kullanımı

XE5 Mobil Uygulamada SQLite Veritabanı kullanımı
 



Merhabalar, Biraz sonra baslayacağımız örnekte XE5 Android üzerinden manuel olarak kod ile sqlite bağlantı, silme, ekleme ve listvievin otomatik yenilenmesi islemlerini göreceğiz. Bu işlemi gerçekleştirmek için birçok yöntem vardır ve ben XE5'in bize sunduğu FireDAC aracılığı ile yapacağım. İnternette XE5 hakkında türkçe çok sıkıntılı oldugu için bende kendi çerçevemde yapabildiğim kadar bütün yazılarımda buna değinmeye çalışacağım. Projemize baslangıçta resimde göreceğiniz üzere: 1 Toolbar 3 buton 1 listviev ekliyoruz ve tasarımını istersek resimdeki gibi yapabilirsiniz devam ediyoruz.

 


 Bilmeyen arkadaslar için butonların native android iconlarını almalari için, butona tıklayıp soldaki Object Inspector'den StyleLookup içerisinden seçmeleri gerekmektedir. Sıradaki ekleyeceğimiz elemanlar veritabanı bağlantısı için: 1-)FDConnection 2-)FDQuery 3-)BindingsList 3-)BindSourceDB 3-)FDPhysSQLiteDriverLink 3-)FDGUIxWaitCursor Bir sorun çıkmasına karşın Uses bloğumu da yazıyorum eksiklerinizi tamamlayabilirsiniz.
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls,
Data.DB, Data.SqlExpr, FireDAC.Stan.Intf, FireDAC.Stan.Option,
FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def,
FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys, FireDAC.Comp.Client,
FireDAC.Stan.Param, FireDAC.DatS, FireDAC.DApt.Intf, FireDAC.DApt,
FireDAC.Comp.DataSet, FMX.Layouts, FMX.ListBox, Data.Bind.Components,
Data.Bind.DBScope, FireDAC.Stan.ExprFuncs, FireDAC.Phys.SQLite,
FireDAC.FMXUI.Wait, FireDAC.Comp.UI, FMX.Platform.Android, FMX.ListView.Types,
FMX.ListView, DateUtils, System.Rtti, System.Bindings.Outputs,
Fmx.Bind.Editors, Data.Bind.EngExt, Fmx.Bind.DBEngExt, FMX.Edit;
Sıradaki ekleyeceğimiz elemanlar veritabanına kayıt için işlemi: 2 adet panel ve her birinin içine 1 tane label ve 1 tane edit ekliyoruz ve asağıdaki görüntüdeki gibi bir şekil yapabilirsiniz.

 


 Benim kişisel tavsiyem kod yazarken kafanızın karışmaması için eklediğiniz ve sık kullanacağınız bileşenlerin isimlerini olduğu gibi bırakmamanızdır. Şimdi kod yazımına geçiyoruz ve ilk yapacağımız ise USES kısmına "System.IOUtils" kütüphanesini ekleme sebebi ise manuel oluşturacağımız sqlitenin yerini ayarlamak için. Veritabani bağlantı işlemi için sol üsteki bağlan butonuna : Var blogumuza 2 adet değişken tanımlayacağız
Var
LFCF : TLinkFillControlToField; // Listviewin Veritabanına bağlanması için gerekli
DbYol : String; // manuel olusturacağımız sqlitenin yerini ayarlamak için
Begin blogunun altından başlayarak öncelikle veritabanı yolumuzu Dbyol değişkenine kaydediyoruz.
DbYol := System.IOUtils.TPath.GetDocumentsPath + PathDelim + 'SqliteDers.s3db'; // Burada yanlış hatırlamıyorsam uygulamamız ile aynı dizine kayıt yolu belirtiyorduk
Sırada Connectionumuzun ayarları var:
With FDConnection1 do
begin
LoginPrompt := False;
Params.Clear;
Params.Values['Database'] := DbYol; // yukarıda belirttiğimiz kayıt dizini
Params.Values['DriverID'] := 'SQLite';// veritabanı türümüz
Params.Values['CharacterSet'] := 'utf8'; // yazı karakteri türü
Connected := True; // bağlantımızı aktif yaptık
// Yoksa SQL veritabanı kendiliğinden otomatik olarak CREATE edilmiş olacaktır...
end;
Veritabanını oluşturduğumuza göre tablomuzu oluşturma evresine geçebiliriz:
With FDQuery1 do
begin
Active := False; // Aktif olma olasılığına karşı kapatılıyor.

// DERS adında tablomuz yoksa baştan yaratıyoruz buranın içerigi size kalmış.
Connection := FDConnection1;
SQL.Clear;
SQL.Add( 'CREATE TABLE IF NOT EXISTS DERS (' );
SQL.Add( ' ADI nvarchar(10)');
SQL.Add( ' );');
ExecSQL; //Tablo yaratma işlemi tamamlandı.
// Listviewe bağlanacak querymizin sql içeriğini nasıl bir listeleme yapmak istiyorsak ona göre ayarlıyoruz
SQL.Clear;
SQL.Add( 'SELECT');
SQL.Add( ' ADI' );
SQL.Add( ' FROM DERS' );
Active := True;
// ListBox'a Bind etmek için hazırlık...
// BindSurceDB1 bu sayede Fieldlari görür.
// DetailFields := 'Adi;Soyadi';
end;
Sırada en önemli yeri olan listview'in binding ayaları var:
ListView1.BeginUpdate; //Listview yükleme işlemine başlatılıyor
BindSourceDB1.DataSet := FDQuery1;
while BindingsList1.BindCompCount > 0 //Aynı butona 1'den fazla basılırsa diye
do BindingsList1.BindComps[0].Free;

LFCF := TLinkFillControlToField.Create(nil);//köprü bağlantı için Linkfillcontrol nesnemizi oluşturuyoruz
With LFCF do //Nesnemiz manuel olduğu için Object inspectorünü buradan ayarlıyoruz.
begin
Control := ListView1;
FillDataSource := BindSourceDB1;
FillDisplayFieldName := 'ADI';
Category := 'Quick Bindings';
AutoFill := True;
AutoActivate := True;
end;
BindingsList1.InsertComponent( LFCF );//Bindigslistin baz alacağı LinkFill'i gösterdik
LFCF.Free; // Artık objemizi serbest bırakabiliriz

FDQuery1.Active := False;
FDQuery1.Active := True;
ListView1.EndUpdate //yükleme işlemi tamamlandı.
Bağlantı butonu ile işimiz bittiğine göre artık kayıt ve silme işlemine geçebiliriz. Kayıt butonumuza:




With TFDQuery.Create(nil) do //Sanal bir FireDAC Query oluşturuyoruz.
begin
Connection := FDConnection1; //Verıtabanı bağlantısını ayarlıyoruz.
SQL.Clear;
SQL.Add( 'INSERT INTO DERS ' ); //Buradaki "DERS" kullandığımız tablonun adı.
SQL.Add( '( ADI )' ); //Buradaki "ADI" alanımızın adı.
SQL.Add(' VALUES ' );
SQL.Add(' (:d0) '); //Rahat olması bakımından parametre ile yapılmıştır bu örnekte.
Params[0].Value := Aditxt.Text; //editin değerini parametremize eşitliyoruz.
ExecSQL; //ExecSQL geri dönüsü olmayan sorgular için kullanılır INSERT DELETE gibi.
Free; //Artık query ile işimiz bittiğine göre serbest bırakabiliriz.
end;
FDQuery1.Active := False; //Yapılan değişikliklerin gözükmesi için query i kapatıyoruz.
FDQuery1.Active := True; //Yapılan değişikliklerin gözükmesi için query i açıyoruz.

Şöyle bir bakılınca Ekle butonumuzdan yapı olarak pek bir farkı yoktur yine parametre göndereceğiz sadece burada sql sorgusunu değiştirecegiz. Sil butonumuza:




With TFDQuery.Create(nil) do //Sanal bir FireDAC Query oluşturuyoruz.
begin
Connection := FDConnection1; //Veritabanı bağlantısını ayarlıyoruz.
SQL.Clear;
SQL.Add( 'Delete From DERS Where ADI = ' ); //Buradaki "DERS" kullandığımız tablonun ve "ADI" yazanda kolonun adı.
SQL.Add( ' :d0 ' ); //Rahat olması bakımından parametre ile yapılmiştir bu örnekte.
Params[0].Value := ListView1.Selected.Text; //listviewin seçilen elemanının değerini parametremize eşitliyoruz.
ExecSQL; //ExecSQL geri dönüsü olmayan sorgular için kullanılır INSERT DELETE gibi.
Free; //Artık query ile işimiz bittiğine göre serbest bırakabiliriz.
end;
FDQuery1.Active := False; //Yapılan değişikliklerin gözükmesi için query i kapatıyoruz.
FDQuery1.Active := True; //Yapılan değişikliklerin gözükmesi için query i açıyoruz.
İste bütün işlem bu kadar yapacağınız projeye göre bunları procedureler içine alıp istediğiniz şekilde kullanabilirsiniz. Yorumlarınzı esirgemeyin. Bu konularda Daha çok bulduğum kaynakları paylaşmaya devam edeceğim. Bu olayı kavramamda yardımcı olan ve bu güzel örneğini bizlere sunan Muharrem ARMAN (mrmarman) teşekkürler.